我有一個應用程序,允許用戶將應用程序SQLite數據庫文件保存到SD卡。這個功能已經存在了一年多了,並且工作得很好。我有用戶通過電子郵件發送我的數據庫文件,以防出現無法重現的錯誤。Android數據庫文件損壞
最近,一位用戶向我發送了他的數據庫文件,當我嘗試將它們加載到我的應用程序(通過將它們放入應用程序的數據庫文件位置)時,應用程序在嘗試打開數據庫文件時崩潰。此用戶在過去之前發送過他的文件,沒有任何問題。
當時和現在我的應用程序之間的唯一區別是:1)我添加了應用程序2-SD功能,以及2)我的應用程序目標2.2現在與1.6時相比(但1.5是兩種情況下的最小SDK版本)。
用戶說他把應用程序放在SD卡上,然後應用程序開始崩潰。它甚至沒有提供提交錯誤報告的選項。
當我放置在模擬器他的文件,我得到了下面的堆棧跟蹤:
11-09 22:32:04.275: ERROR/AndroidRuntime(757): Caused by: android.database.sqlite.SQLiteException: file is encrypted or is not a database
11-09 22:32:04.275: ERROR/AndroidRuntime(757): at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
11-09 22:32:04.275: ERROR/AndroidRuntime(757): at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1636)
11-09 22:32:04.275: ERROR/AndroidRuntime(757): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1586)
11-09 22:32:04.275: ERROR/AndroidRuntime(757): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:638)
11-09 22:32:04.275: ERROR/AndroidRuntime(757): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:168)
他之前給我發電子郵件數據,並且文件有正確的數據庫名和擴展名,所以我給他懷疑的好處,而不是假設他發送了不正確的文件。有沒有人見過這個問題,並知道任何可能的原因和/或解決方案?
更新 如果它有什麼區別,我從用戶那裏發現他的手機是HTC Evo 4G。我想我在某些地方閱讀了關於加密數據庫文件的更多最新Android版本,其中數據庫文件存儲在/ data/secure/...下,而不是/ data/data/...我想知道這是否可能是相關的?在任何情況下,在進一步詢問用戶之後,我至少知道它是數據庫文件中有問題的一個特定表。我的應用程序的不同部分與數據庫文件中的不同表進行交互。該應用程序工作正常,並允許他訪問其他表時,保存/讀取數據,但當他訪問一個特定的表,只是試圖打開該文件產生他的錯誤。我想我可以添加一個醜陋的修復,捕獲這個異常,如果它發生,然後刪除損壞的表,然後重新創建它。思考?
好的,你可以使用SQLite的任何工具檢查這個文件,嘗試在SQLite工具中打開這個數據庫文件,看看你是否得到正確的數據。 – user370305
這正是我嘗試的第一件事。當我在SQLite中打開文件時,那裏什麼也沒有。它沒有顯示我的桌子,桌子是如何建造的,等等......即使該文件不是0字節,該文件中也沒有任何內容。 – Michael
@Michael我也這樣得到這個問題。你有沒有找到解決方案?我的問題是http://stackoverflow.com/questions/10210503/database-disk-image-is-malformed-or-file-is-encrypted-or-is-not-a-database。 – Judy