我已经成功创建了一个 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");
但是,这不起作用,因为 INSERT INTO 只是添加新行而不是替换现有行。我也尝试过 REPLACE INTO、INSERT 或 REPLACE INTO 和
db.execSQL("INSERT INTO quiz (_id, favouries) SELECT _id, favourites FROM temp_quiz");
其中没有工作。
目前我确实通过更改表的名称,调用 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();
}
然而,虽然这很有效,但它非常缓慢,并且随着我的问题数量的增加只会变得更糟。有没有一种快速的方法来完成这一切?
谢谢!PS 理想情况下,如果该行存在,它应该只更新该行。因此,如果在升级中我决定删除一个问题,它应该考虑到这一点,如果该行不包含任何其他数据,则不要添加新行。让它删除没有问题数据的行而不是阻止它们被添加可能更容易。