Upgrade SQLite database from one version to another?

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;
}

...
14
задан Pratik Butani 10 February 2014 в 06:31
поделиться

1 ответ

Хорошо, прежде чем вы столкнетесь с более серьезными проблемами, вы должны знать, что SQLite ограничен командой ALTER TABLE, она позволяет добавить и переименовать только нет remove / drop, что выполняется при воссоздании таблицы.

Вы всегда должны иметь под рукой запрос на создание новой таблицы и использовать его для обновления и переноса любых существующих данных. Примечание: метод onUpgrade запускает один для вашего вспомогательного объекта sqlite, и вам необходимо обрабатывать все таблицы в нем.

Итак, что рекомендуется при обновлении:

  • beginTransaction
  • запустить создание таблицы с , если не существует (мы выполняем обновление, поэтому таблица может еще не существовать, она не будет изменена и 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 )
  • setTransactionSuccessful

.

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();
}
47
ответ дан 1 December 2019 в 06:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: