2017-10-19 42 views
2

所以我有一個數據庫應用程序與一個表。我想推出一個包含數據庫中新表的大更新。想用SQLite數據庫的onUpgrade方法稍微澄清一下

我成功地運用了onUpgrade方法,通過在onUpgrade方法做「db.execSQL(SQL_CREATE_STRING」創建舊數據庫中的新表。

我的問題可能不會成爲一個偉大的...但它我找不到答案的問題

下次我升級數據庫時發生了什麼?在我添加表之前,數據庫的版本是2,在數據庫版本是3的新表之後。我想添加另一個表的道路嗎?我是否將當前的「db.execSQL(SQL_CREATE_STRING」保留在onUpgrade中,還是必須先刪除它?

SQL_CREATE_STRING以「CREATE TABLE IF NOT EXISTS」開頭,所以我假設我可以將它留在onUpgrade方法中,對嗎?因爲如果它已經看到表已經存在,它就不會嘗試製作另一個表。

我只是想確認這個想法。

謝謝!

+0

您可能會發現[不同的方法](https://stackoverflow.com/questions/46339534/android-sqlite-detect-if-new-version-not-found/46342520#46342520)感興趣。有點冗長,但它使得添加表/列/索引輕而易舉,而無需使用'onUpgrade'。適用於我。 – MikeT

回答

3

SQL_CREATE_STRING以「CREATE TABLE IF NOT EXISTS」開頭,所以我假設我可以將它留在onUpgrade方法中,對嗎?因爲如果它已經看到表已經存在,它就不會嘗試製作另一個表。

聽起來沒錯。但是,當你開始擁有更多的版本時,可能很難跟蹤哪些更新可以運行,哪些不能運行。

我推薦的做法是在自己的方法中執行每個升級步驟,並按順序執行給定升級調用所需的所有升級步驟。舉例來說:

public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) { 
    for(int i = oldVersion + 1; i < newVersion; i++) { 
     switch(i) { 
     case 2: upgradeFromv1Tov2(); break; 
     case 3: upgradeFromv2Tov3(); break; 
     ... 
    } 
} 

這樣,如果某人正在從例如v1到v3,升級將運行v1-> v2然後是v2-> v3邏輯。這樣做意味着在創建每個升級步驟時,您確切知道數據庫模式將處於什麼狀態(即之前的版本),因此您不必擔心所有升級步驟之間的交互同時發生。