2012-11-29 41 views
0

編輯: 我的數據庫有2個表。一張表是需要在更新後保存和恢復的用戶數據。另一個表是在每次更新時從資產文件夾加載的常量數據。Android:DatabaseObjectNotClosedException在OnUpgarde雖然它關閉

因此,當我升級數據庫時,我首先將表1保存到外部數據庫。然後我用copyDataBase();覆蓋數據庫並使用「常量」表,然後將保存的表複製回來。

在我複製數據庫之前,我需要關閉它,否則數據很奇怪。我總是得到一個

close() was never explicitly called on database '/data/data/com.myproject/databases/mdb.sqlite' 

其中openOrCreateDatabase被調用。 這很奇怪,因爲我之前打過電話。我能做什麼?

public void onUpgrade(SQLiteDatabase db, 
     int oldVersion, int newVersion) { 

//save db tables to other db ... 

db.close(); 
copyDataBase(); 
db = SQLiteDatabase.openOrCreateDatabase(databaseFile, null); 

//... save back to db 
} 

感謝 期Euribor

+0

你**不要**顯示**哪裏**錯誤正在發生。在'copyDataBase();'或'db = SQLiteDatabase.openOrCreateDatabase(databaseFile,null);'?你也不會在這些方法中顯示任何代碼。你如何期待我們幫助你? –

+0

我的copyDataBase()從這裏:http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/。無論如何,它不會做任何與錯誤消息相關的事情,它只是讓我感覺到我的功能所做的一切。並且崩潰發生在openOrCreateDatabase中,如 – user1857855

回答

0

我會強烈建議關閉已打開,而onUpgrade將執行數據庫。你正在干涉一個明智的行動,這將導致很多麻煩!

您應該考慮使用其他機制來確定數據庫是否已升級並進行備份/複製。

編輯

如果你只是想從資產文件夾,你爲什麼不只是將數據庫複製的SD卡更換一個表,打開連接並從內部與替換表的內容一個來自資產數據庫?這可以在onUpgrade中完成而不關閉內部數據庫。

您不應複製數據庫文件來替換/更新單個表。

+0

提到的那樣,你認爲什麼明智的行爲?它只是一個簡單的 如果(版本!= DATABASE_VERSION)嘗試如果(版本== 0){onCreate(myDataBase); } else { onUpgrade(myDataBase,version,DATABASE_VERSION); } 在一個交易 – user1857855

+0

內你在onUpgrade內調用?這看起來很讓人困惑,你在做什麼......從我讀到的內容來看,我會說你做過什麼或嘗試做什麼:你做錯了。你能否在你的問題中解釋你實際上想要達到的目標? – WarrenFaith

+0

查看已更新的問題 – user1857855