2010-08-25 57 views
23

我的應用程序使用一個未捕獲的異常處理程序,在應用程序崩潰時向我發送堆棧跟蹤。我經常從隨機用戶那裏得到這份報告。隨機異常android.database.sqlite.SQLiteException:無法打開數據庫文件

我不能複製它,數據庫的開放總是成功的在我的情況。這不是存儲在外部SD卡上的數據庫,只有使用SQLiteOpenHelper(context, "SomeName", null, someVersionCode)打開的數據庫。

你有這方面的經驗嗎?打開數據庫之前可以檢查的可能性有哪些?

謝謝!

android.database.sqlite.SQLiteException: unable to open database file 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
    at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4363) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.database.sqlite.SQLiteException: unable to open database file 
    at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 
    at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1698) 
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:739) 
    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:761) 
    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:754) 
    at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:476) 
    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193) 
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98) 
+0

確保資產的文件夾內的數據庫名稱和申報數據庫名稱數據庫中的輔助類是一樣的。並在嘗試複製數據庫時使用數據庫名稱檢查數據庫的路徑。把你的代碼放在這裏,以便其他人可以檢查你的數據庫幫助類。 – Maulik 2013-10-15 12:37:04

+0

錯誤顯示數據庫無法打開數據庫,這意味着您可能沒有在打開的數據庫方法中設置屬性「SQLiteDatabase.OPEN_READWRITE」條件,並且更改爲數據庫文件屬性更改讀取寫入權限。確保以上兩種情況。 – Maulik 2013-10-15 12:42:30

+0

訪問此[鏈接](http://stackoverflow.com/questions/4187631/unable-to-open-database-file-when-using-sqliteopenhelper-with-instrumentation)可能它會幫你充滿 – Engineer 2013-10-21 06:52:07

回答

2

之一時,這可能發生的可能出現的情況 - 是當您從多個線程訪問數據庫文件,當文件被一個線程鎖定,當你試圖打開它從修改另一個線程。

+0

我也有同樣的問題。 我將備忘錄保存在數據庫中。 當我插入一個新條目並按'返回'或'主頁'鍵返回到主屏幕。 之後,我嘗試使用備份代理恢復我的備忘錄,我總是得到相同的錯誤(錯誤代碼14)。 如果我殺了備忘錄進程,那麼我的備忘錄備份代理可以正常工作。 我想數據庫被另一個線程打開。 我怎樣才能關閉它? 任何人都可以提供解決方案? – 2011-02-11 11:39:03

5

升級我的Android固件後,我得到了同樣的錯誤。該數據庫是由舊固件創建的,因此無法通過新固件打開。 用戶可以通過卸載並重新安裝您的應用程序來解決此錯誤。

0

@yuku

這種問題我面臨的,我已經解決了這個問題,這樣的方式。

  1. 我們需要檢查數據庫是否舊是相同新的數據庫,如果事情變成新的數據庫那個時候我們就需要刪除舊數據庫並安裝新的數據庫或改變表按新的數據庫

  2. 第二個選擇是容易只是卸載舊的應用程序並安裝比新應用

希望這會對你有用。

0

對於任何數據庫應用程序,我首先使用Firefox的Sqlite Manager插件創建sqlite數據庫,並將其放入/ res/raw文件夾中。然後在我的代碼中,我檢查數據庫是否存在於這個應用程序的/ data/data中。如果沒有,我用我的代碼將db文件複製到該目錄。

對於您的情況,很難確定確切的原因,而無法確定您是如何創建數據庫的,以及如何使用它。可能有幾個原因導致發生此異常。其他人已經提到過一些問題。我想提一個。你可以嘗試像這樣打開數據庫

SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS); 

也許,如果你顯示你的代碼片段,我可以嘗試更好的幫助。那麼,我的方法在這裏描述,你可以看看是否有幫助。

Populating SQLite Database

0

我面臨這個問題。

我的一個應用程序的行爲方式相同,因爲我添加了代碼以將數據庫從資產複製到啓動屏幕上的指定位置(應用程序啓動時可見的屏幕並在幾秒後自動關閉視圖)。

而在少數情況下發生的情況是,該數據庫沒有在指定的時間範圍內複製,並且從應用程序內訪問數據庫導致異常。

我做了什麼,

我剛寫的代碼在後臺線程啓動畫面複製數據庫,並顯示給用戶,直到時間僅數據庫後,顯示下一個屏幕是不可複製的。

如果應用程序安裝在以前的版本上,可能會有另一種解決方案,如果需要進行數據防護,並且新版本包含的模型與以前版本的應用程序中保存的數據相比,以前的版本。

2

如果您的應用程序在同一時間從多個線程打開數據庫,則可能是此例外的原因。

請嘗試同步方法打開database.synchronized方法將不允許數據庫同時從多個線程打開。 把下面的代碼在你的dbHelper

private synchronized SQLiteDatabase getWritableDB() { 
     //get your database and return it from this method. 
} 

,並調用這些方法時,你越來越分貝。 希望它會有所幫助。

0

重新安裝應用程序,並嘗試使用synchronized塊數據庫凝乳操作:)

相關問題