2013-03-25 41 views
1

我有2個數據庫。 1是一個MySQL,我使用遊戲API收集有關遊戲的最新信息。我擁有的另一個數據庫是我在我的應用程序中創建的sqlite數據庫(都具有相同的表和列)。我希望這樣做的工作是,應用程序啓動,然後MySQL版本將被檢查(每當我玩的遊戲有更新時更新)我檢查是否MySQL版本匹配sqlite版本並在需要時更新。調用sqlite onUpgrade問題

我遇到的困惑是我不希望用戶在發生次要MySQL數據庫更改時不得不更新整個應用程序(項目統計信息被更改,項目被添加,字符被添加或統計數據一個角色的能力被調整了),因爲我所看到的在這裏和Vogella教程是,它似乎我需要真正的手動更改:

private static final int DATABASE_VERSION = 1; //<<<<<Manually change this 
... 

public MySQLiteHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

這違背了我想要完成的目的。

1)有沒有辦法更新,而不必實際手動更改代碼的DATABASE_VERSION?

2)我可以直接打電話升級(db,oldVersion,newVersion),並把我想要的參數,或者這是一個非常壞的主意,它應該通過getWritableDatabase()處理?

+0

有[SQLiteDatabase#setVersion(int)](https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#setVersion%28int%29),但不應該聯合使用用'SQLiteOpenHelper' – zapl 2013-03-25 20:01:45

回答

1

這聽起來像你正在從中央MySQL數據庫中讀取你的模式,只是在Android設備上保留本地副本。當您更改中央數據庫的架構時,是的,手動更改本地副本是愚蠢的。

1)有沒有辦法更新DATABASE_VERSION,而無需在代碼中實際手動更改它?

DATABASE_VERSION就像任何其他變量,如果你想從外部來源控制它的價值,你可以。老實說,你甚至不需要這個變量,它僅在SQLiteOpenHelper的constructors使用:

SQLiteOpenHelper(Context context, String name, 
     SQLiteDatabase.CursorFactory factory, int version) 

SQLiteDatabase維護它自己的私人版本號。

2)我可以直接調用onUpgrade(db,oldVersion,newVersion)...?

我不建議這樣做,因爲您不會更改內部版本號並跳過SQLiteOpenHelper使用的其他內部檢查。
是的,您可以手動執行這些檢查中的許多檢查,但是對於您創建的每個解決方案而言,使SQLiteOpenHelper的用處不大。在某些時候,您最好直接撥打Context#openOrCreateDatabase(),因爲您已經創建了自己的版本控制代碼。

3

數據庫版本僅改變時,當表結構發生了變化,添加即表或刪除,或者當某些列改變,添加或刪除。當出現這種情況並安裝了新版應用程序時,Android會檢測到新的數據庫版本並呼叫onUpgrade

如果你只是更新您的表中的數據,沒有在表結構沒有變化,因此沒有必要增加數據庫的版本號。

在你的情況,你可以添加一些序列號或時間戳列中的,用於識別當前數據的版本之一和比較,對版本或時間戳存儲在相應的SQLite數據庫表。

當這些不同時,您可以更新MySQL數據庫中的數據。

更新

當你更新你的應用程序,但表結構是不變的,則數據庫版本應該保持不變,數據庫及其數據保持不變。

更新應用程序和更改表結構時,會增加數據庫版本號。 Android比較當前版本和新版本,並調用onUpgrade。現在,您可以執行必要的步驟來升級數據庫,更改數據庫佈局,填充新的表或列,以及需要執行的任何操作。你甚至可以摧毀一切,從頭開始建立一個新的數據庫。

這一切都是獨立於日常更新,當您的應用程序運行並從主服務器數據庫中拉出當前的數據。

+0

好吧,我想我開始明白了。說我用一些表填充sqlite數據庫,並填充表中的信息,如果用戶退出應用程序,並返回將信息仍然在表中?我知道桌子呆在那裏,但是居住在他們那裏的信息也保持不變?如果是這樣,當遊戲本身有更新時我需要重新填充它們。因爲除非遊戲本身具有更新並且API在MySQL內部加載不同的數據,否則表格不會被更改。 – JoeyL 2013-03-25 22:25:53

+0

@JoeyL請參閱更新的答案。 – 2013-03-25 23:20:29