Android SQLite升级而不会丢失数据

And*_*uin 9 sqlite android upgrade data-loss

我已经成功创建了一个SQLite数据库,它工作正常.但是,当调用onUpgrade方法时,我希望这样做而不会丢失数据.我正在开发的应用程序是一个测验应用程序.简单地说,当调用onCreate方法时,我使用问题,答案等创建和预填充数据库.最后一列是他们是否将问题设置为收藏夹.我想要做的是,当调用onUpgrade方法时,我想暂时保存那一列,删除整个数据库,使用我对旧问题进行的任何编辑重新创建它,然后重新添加任何新问题. - 回复他们设置为收藏的问题.

所以我试过的一个选项如下:

db.execSQL("ALTER TABLE quiz RENAME TO temp_quiz");
onCreate(db);
db.execSQL("INSERT INTO quiz (favouries) SELECT favourites FROM temp_quiz");
db.execSQL("DROP TABLE IF EXISTS temp_quiz");
Run Code Online (Sandbox Code Playgroud)

但是,由于INSERT INTO只添加新行而不是替换现有行,因此无效.我也尝试过REPLACE INTO,INSERT或REPLACE INTO和

db.execSQL("INSERT INTO quiz (_id, favouries) SELECT _id, favourites FROM temp_quiz");
Run Code Online (Sandbox Code Playgroud)

其中没有用.

目前我确实通过更改表的名称,调用onCreate(db)方法然后设置一个游标来读取每一行并使用db.update()方法来设置它,如下所示:

int place = 1;
int TOTAL_NUMBER_OF_ROWS = 500;

while (place < TOTAL_NUMBER_OF_ROWS) {

String[] columns = new String[] { "_id", ..........., "FAVOURITES" };
// not included all the middle columns

Cursor c = db.query("temp_quiz", columns, "_id=" + place, null, null, null, null);

c.moveToFirst(); 

String s = c.getString(10);
// gets the value from the FAVOURITES column


ContentValues values = new ContentValues(); 
values.put(KEY_FLAG, s);

String where = KEY_ROWID + "=" + place;

db.update(DATABASE_TABLE, values, where, null);

place++;

c.close();

}
Run Code Online (Sandbox Code Playgroud)

然而,虽然这种方法很有效,但只会随着问题数量的增加而变得更糟.有没有快速的方法来做这一切?

谢谢!PS理想情况下,如果行存在,它应该只更新行.因此,如果在升级中我决定删除一个问题,它应该考虑到这一点,如果该行不包含任何其他数据,则不添加新行.可能更容易让它删除没有问题数据的行而不是阻止它们被添加.

And*_*uin 4

将其更改为:

db.execSQL("UPDATE new_quiz SET favourites = ( SELECT old_quiz.favourites 
FROM old_quiz WHERE new_quiz._id = old_quiz._id) WHERE EXISTS 
( SELECT old_quiz.favourites FROM old_quiz WHERE new_quiz._id = old_quiz._id)");
Run Code Online (Sandbox Code Playgroud)

哪个有效:D

  • 我认为你的意思是“更新 new_quiz”,而不是 old_quiz =) (2认同)