我創建了一個SQLite數據庫成功,它工作正常。但是,當onUpgrade方法被調用時,我想這樣做而不會丟失數據。我正在開發的應用程序是一個測驗應用程序。簡單地說,當onCreate方法被調用時,我使用問題,答案等創建並預填充數據庫。最後一列是他們是否已將問題設置爲最喜歡的問題。我想要做的是,當onUpgrade方法被調用時,我想暫時保存那一列,刪除整個數據庫,通過對舊問題所做的任何編輯來重新創建它,然後添加任何新問題,然後重新創建 - 回到他們設定爲最愛的問題。Android SQLite升級而不丟失數據
所以一個選項我嘗試了以下內容:
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的工作只是增加了新的行而不是替換現有行。我也嘗試更換,插入或更換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();
}
然而,這項工作非常緩慢,只會隨着問題數量的增加而變得更糟。有沒有快速的方法來做到這一點?
謝謝!附:理想情況下,如果行存在,它應該只更新行。因此,如果在升級過程中我決定刪除問題,則應考慮到這一點,如果該行不包含任何其他數據,則不要添加新行。可以更容易地刪除沒有問題數據的行,而不是阻止它們被添加。
我想你的意思是「更新new_quiz」,而不是old_quiz =) – hiBrianLee
對不起,這就是我的意思。謝謝:D – AndroidPenguin
@AndroidPenguin,根據您在評論中的說明修改。 –