2011-02-22 39 views
14

在最近的兩週內,我沒有發佈更新到我的應用程序,我開始收集一大堆數據庫損壞的報告。以下是堆棧跟蹤。 Android無法打開數據庫,我的電腦上的sqlite-manager程序也無法打開。但是,SQLite管理器插件到Firefox可以打開它。運行命令「compact database」後,數據庫已修復,我可以在android中打開它。有沒有什麼辦法可以在我的應用程序中做這樣的事情?最大的問題是,我甚至無法嘗試打開數據庫,因爲Android的新版本會立即刪除並替換數據庫,正如您在下面的堆棧跟蹤中看到的那樣。 PRAGMA語句可以在不打開數據庫的情況下執行嗎?Android數據庫損壞,但可以在SQLite Manager中打開。可恢復?

問候,

02-22 09:55:20.245: ERROR/Database(5382): CREATE TABLE android_metadata failed 
02-22 09:55:20.245: ERROR/Database(5382): Failed to setLocale() when constructing, closing the database 
02-22 09:55:20.245: ERROR/Database(5382): android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1950) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1818) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 

02-22 09:55:20.245: ERROR/Database(5382): Deleting and re-creating corrupt database /mnt/sdcard/myapp/backup.sqlite 
02-22 09:55:20.245: ERROR/Database(5382): android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1950) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1818) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 

編輯:我的經理打開數據庫是這樣的:

db = SQLiteDatabase.openDatabase(database, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS); 

但是當我運行此:

String sqlQuery = "pragma integrity_check"; 
db.execSQL(sqlQuery); 

我得到這個:

ERROR/AndroidRuntime(9144): Caused by: android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed: pragma integrity_check 

編輯2:我已經意識到清理數據庫可以解決問題。但是,如果我從我的應用程序內部使用exeSQL(「真空」)抽真空,這並沒有幫助。爲什麼是這樣? :'(

回答

1

的規範良好的方法來恢復損壞的數據庫是轉儲出來的SQL,然後讀回在到新的數據庫它的死很容易與sqlite的工具:

sqlite in.db .dump | sqlite out.db 

。 ..但是,當然,你需要做的代碼,我真的不知道.dump是否可以從任何地方。

我建議你可能想看看它是如何得到損壞首先--- SQLite對我來說一直很穩定,雖然我只用它在內部存儲上。你能檢查FAT文件系統,看它是否損壞嗎?我已經看到了,例如,例如,數碼相機將以各種模糊的方式徹底地破壞卡上的文件系統......

0

在您的應用程序中,您是否在退出活動之前關閉數據庫?觀看logcat,並檢查運行應用程序時是否有任何錯誤或警告。

1

Android刪除數據庫確實是一個issue

我剛剛意識到解決方案可能是使用SQLJet而不是默認的Android SQLite實現。
正如其名稱所暗示的,SQLJet是一個開源的Java SQLite客戶端,它可以在Android上運行。

+0

謝謝,這實際上看起來很有趣! – pgsandstrom

+0

@Nicolas Raoul你可以解釋一下,SQLJet如何解決OP /阻止它的問題?我很好奇,因爲我與OP有相同的問題:) – AgentKnopf

+0

SQLite只是沒有這個bug –

相關問題