2012-07-16 73 views
1

我在我的android應用程序中有一個只讀數據庫,我定期更新。該應用程序始終在其資產中攜帶最新版本的數據庫。SQLiteOpenHelper onUpgrade多次調用

我增加,我傳入構造爲我SQLiteOpenHelper的子類的版本號,碰撞它(這種情況下)到版本4

我有以下代碼:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // copy from assets to local storage; version really doesn't matter; 
    // DB will be opened from the target location. 
    copyDataBase(); 
} 

這得到叫我撥打電話獲得可讀數據庫:

SQLiteDatabase db = myDBHelper.getReadableDatabase(); 
// Here db.getVersion() correctly returns "4", the newVersion. 
// db is also usable and has the correct data. 

但每次我打電話getReadableDatabase onUpgrade時間會從oldVersion = 3叫NEWVERSION = 4。

任何想法爲什麼版本不粘?

+0

這可能有助於查看您的代碼,瞭解如何從您的活動中調用這些代碼。 – Nate 2012-07-16 21:17:26

回答

1

好了幾件事。

「copyDataBase()」調用有點可疑,因爲它可能會複製一些已保存的具有舊版本代碼的db副本。 db.getVersion()可能會使用傳遞給你的helper類的構造函數的內容,而不是從任何地方實際讀取它。所以我會仔細檢查或張貼它。

另外,還要確保你確實是從您的子類調用構造函數的超:

DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     Log.d("DatabaseHelper", "constructor. Version="+DATABASE_VERSION); 
    } 

,並確保日誌輸出顯示在你的情況「4」,而不是3。

+0

謝謝。我沒有包含我的copyDataBase()調用的副本,因爲它實際上是從我的資產(以前保存的數據庫副本)字面上複製字節到本地存儲。 (我實際上調用了上面的super構造函數,Log.d輸出「4」,如預期的那樣)。因此,如果保存的數據庫嵌入了版本代碼,我會在哪裏找到要更改的版本?謝謝! – 2012-07-16 22:54:20

+0

啊哈 - 在這裏得到了答案:http://stackoverflow.com/questions/8030779/change-sqlite-database-version-number。需要做一個編譯指示來設置複製數據庫的版本。謝謝! – 2012-07-16 23:22:40

1

這只是一個猜測。我遇到了同樣的問題,所以我遇到了這個帖子。後來我意識到我在使用sqLiteDatabase.beginTransaction();sqLiteDatabase.endTransaction(); ,但在結束交易之前未調用sqLiteDatabase.setTransactionSuccessful();。我把它放進去然後固定它。希望這會有所幫助,儘管我知道它很晚。

+0

你讓我的一天,非常感謝你的朋友 – 2016-08-29 13:42:30