I am getting an error from Logcat
saying that a certain column (in my SQLiteOpenHelper
subclass) does not exist. I thought I could upgrade the database by changing the DATABASE_CREATE
string. But apparently not, so how can I (step-by-step) upgrade my SQLite Database from version 1 to version 2?
I apologize if the question seems "noobish", but I am still learning about Android.
@Pentium10 This is what I do in onUpgrade:
private static final int DATABASE_VERSION = 1;
....
switch (upgradeVersion) {
case 1:
db.execSQL("ALTER TABLE task ADD body TEXT");
upgradeVersion = 2;
break;
}
...
Хорошо, прежде чем вы столкнетесь с более серьезными проблемами, вы должны знать, что SQLite ограничен командой ALTER TABLE, она позволяет добавить
и переименовать только
нет remove / drop, что выполняется при воссоздании таблицы.
Вы всегда должны иметь под рукой запрос на создание новой таблицы и использовать его для обновления и переноса любых существующих данных. Примечание: метод onUpgrade запускает один для вашего вспомогательного объекта sqlite, и вам необходимо обрабатывать все таблицы в нем.
Итак, что рекомендуется при обновлении:
, если не существует
(мы выполняем обновление, поэтому таблица может еще не существовать, она не будет изменена и drop) List columns = DBUtils.GetColumns (db, TableName);
ALTER table "+ TableName +" RENAME TO 'temp_ "+ TableName
) columns.retainAll (DBUtils.GetColumns (db, TableName));
) String cols = StringUtils.join (столбцы, ",");
db.execSQL (String.format (
"ВСТАВИТЬ В% s (% s) ВЫБРАТЬ% s из temp_% s",
TableName, cols, cols, TableName));
) DROP table 'temp_ "+ TableName
) .
public static List<String> GetColumns(SQLiteDatabase db, String tableName) {
List<String> ar = null;
Cursor c = null;
try {
c = db.rawQuery("select * from " + tableName + " limit 1", null);
if (c != null) {
ar = new ArrayList<String>(Arrays.asList(c.getColumnNames()));
}
} catch (Exception e) {
Log.v(tableName, e.getMessage(), e);
e.printStackTrace();
} finally {
if (c != null)
c.close();
}
return ar;
}
public static String join(List<String> list, String delim) {
StringBuilder buf = new StringBuilder();
int num = list.size();
for (int i = 0; i < num; i++) {
if (i != 0)
buf.append(delim);
buf.append((String) list.get(i));
}
return buf.toString();
}