Управление версиями базы данных Android - PullRequest
1 голос
/ 29 августа 2011

Я хочу, чтобы база данных sqlite моего приложения очищалась при каждом обновлении приложения.Для этого я делаю запрос на удаление таблиц для всех своих таблиц в функции «onUpgrade» SQLiteDatabase.

У меня две проблемы: - при первом запуске моего приложения я не выполняю никакихспециальный.- при втором запуске я добавляю строку "setVersion (2)".Он вызывает метод onUpgrade, но журналы странные:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
    Log.d("GDB", "onUpgrade "+oldVersion+" -> "+newVersion);
}
----------------------------------------------------------
DEBUG/GDB(5928): onUpgrade 2 -> 1

Так что, когда я делаю setVersion (), две версии переключаются .....

Моя вторая проблемав том, что я запускаю свое приложение в третий раз, без изменения кода (поэтому setVersion (2) уже здесь), метод onUpgrade вызывается снова!Я что-то упустил, чтобы окончательно установить версию на 2?

1 Ответ

3 голосов
/ 29 августа 2011

Я не думаю, что вы должны устанавливать версию базы данных в коде напрямую, используя метод setVersion.Вместо этого вы должны передать версию схемы в конструктор вашего SQLiteOpenHelper (или, по крайней мере, вашего класса, который расширяет это).Ваш метод onUpgrade должен затем содержать операторы условия, чтобы решить, что запускать, в зависимости от версии, с которой обновляется пользователь.Эти условия должны сформировать каскад, чтобы из низшей версии последовательно применялись все обновления базы данных, необходимые для перехода пользователя на текущий уровень.Поэтому, когда вы хотите изменить свою схему, вы добавляете новое условие в свой onUpgrade и повышаете версию схемы, передаваемую вашему конструктору.

Вот как выглядит конструктор в OpenHelper:

public TiftHelper(Context context) {
    super(context, DATABASE_NAME, null, SCHEMA_VERSION);
}

Тогда onUpgrade выглядит примерно так:

@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.d(TAG, "on upgrade called. Old version:" + oldVersion
                + ". New version:" + newVersion);

        if (oldVersion == 19) {
            db.execSQL("create table challenges_temp as select * from challenges;");
            db.execSQL("drop table challenges;");
            db.execSQL(create_challenges);
            db.execSQL("insert into challenges (_id, name, is_predef, status) select _id, name, is_predef, 'IN_PROGRESS' from challenges_temp");
            db.execSQL("drop table challenges_temp;");
        }
        if (oldVersion <= 20) {
            // adding the status column to the challenges table
            db.execSQL("create table challenges_temp as select * from challenges;");
            db.execSQL("drop table challenges;");
            db.execSQL(create_challenges);
            db.execSQL("insert into challenges (_id, name, is_predef, status) select _id, name, is_predef, 'IN_PROGRESS' from challenges_temp");
            db.execSQL("drop table challenges_temp;");
        }

и т. Д.

Это прекрасно работает для меня.

...