Я не думаю, что вы должны устанавливать версию базы данных в коде напрямую, используя метод 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;");
}
и т. Д.
Это прекрасно работает для меня.