2011-11-10 135 views
1

我有一個應用程序,允許用戶將應用程序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/...我想知道這是否可能是相關的?在任何情況下,在進一步詢問用戶之後,我至少知道它是數據庫文件中有問題的一個特定表。我的應用程序的不同部分與數據庫文件中的不同表進行交互。該應用程序工作正常,並允許他訪問其他表時,保存/讀取數據,但當他訪問一個特定的表,只是試圖打開該文件產生他的錯誤。我想我可以添加一個醜陋的修復,捕獲這個異常,如果它發生,然後刪除損壞的表,然後重新創建它。思考?

+0

好的,你可以使用SQLite的任何工具檢查這個文件,嘗試在SQLite工具中打開這個數據庫文件,看看你是否得到正確的數據。 – user370305

+0

這正是我嘗試的第一件事。當我在SQLite中打開文件時,那裏什麼也沒有。它沒有顯示我的桌子,桌子是如何建造的,等等......即使該文件不是0字節,該文件中也沒有任何內容。 – Michael

+0

@Michael我也這樣得到這個問題。你有沒有找到解決方案?我的問題是http://stackoverflow.com/questions/10210503/database-disk-image-is-malformed-or-file-is-encrypted-or-is-not-a-database。 – Judy

回答

0

我也有一個(相當小)數據庫的應用程序,最近我得到崩潰報告,因爲我無法重現數據庫問題。

玩我的應用程序,真的推它最終導致崩潰。

在我的情況的原因是,由於many fast opening/closing/update requests, interruption of the app, language changes during the app, etc so the system somehow corrupted the db.

我現在實現的解決方案是

a. close/reopen the db often to avoid problems 

b. have a consistency-check routine for every save or retrieve of data now - lots of overhead - but that cleared it fo me so far... 

PS我沒有拿到,雖然同樣崩潰報告你的。現在我的桌上現在有幾款不同的Android手機用於測試,幾乎從未碰到最新的高端手機。 這些問題似乎更多地發生在小型內存/速度較慢的CPU電話上,而不是高速的高端電話上。 - 但說實話,我仍然對此感到困惑! ...可能SD卡的使用與此有關嗎?

+0

謝謝。每次我需要訪問時,我都會關閉/重新打開數據庫,但是我沒有一致性檢查。我需要研究一下。你是如何設置你的支票?圍繞數據庫打開/保存語句的try-catch塊封裝線,並在發現異常時提醒用戶遇到問題?還是更深一層? – Michael

+0

我使用try-catch進行一致性檢查以確保沒有無效數據。如果我碰巧找到侵入數據,我使用某些默認值來替換無效值。在我的情況下,這是可能的,我不必告知用戶。他可能會驚訝於某些存儲值已丟失 - 但這可以被原諒。順便說一下,我必須在所有活動中爲此重複相同的代碼,以便他們可以在這些情況下輕鬆做出反應 - 但是,這可能不是最好的方法。祝您好運 - 再次 - 沒有人真正知道這是否是解決方案,不幸 – user387184