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理想情况下,如果行存在,它应该只更新行.因此,如果在升级中我决定删除一个问题,它应该考虑到这一点,如果该行不包含任何其他数据,则不添加新行.可能更容易让它删除没有问题数据的行而不是阻止它们被添加.
将其更改为:
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
| 归档时间: |
|
| 查看次数: |
14010 次 |
| 最近记录: |