随机exceptionandroid.database.sqlite.SQLiteException:无法打开数据库文件

我的应用程序使用未捕获的exception处理程序,在应用程序崩溃时将堆栈跟踪发送给我。 我经常从随机用户那里得到这个报告。

我不能复制它,数据库的开放总是成功的在我的情况。 这不是存储在外部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) 

Solutions Collecting From Web of "随机exceptionandroid.database.sqlite.SQLiteException:无法打开数据库文件"

升级我的Android固件后,我得到了同样的错误。 数据库是由旧固件创build的,因此无法通过新固件打开。 用户可以通过卸载并重新安装你的应用程序来解决这个错误。

当这种情况发生时,可能出现的情况之一就是当你从多个线程访问你的数据库文件时,以及当你试图从另一个线程打开文件时,文件被其中一个线程locking。

如果您的应用程序在同一时间从多个线程打开数据库,则可能是此例外的原因。

请尝试同步方法来打开database.synchronized方法将不允许数据库同时从多个线程打开。 把下面的代码放到你的dbHelper中

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

并调用这些方法,当你正在获取数据库。 希望它会有所帮助。

@yuku

我遇到过这样的问题,我就这样解决了这个问题。

  1. 我们需要检查旧的数据库是否与新的数据库相同,如果有东西改变成新的数据库,我们需要删除旧的数据库和安装新的数据库,或根据新的数据库

  2. 第二个选项很简单,就是卸载旧的应用程序,然后安装新的应用程序

希望这会为你工作.. !!!

对于任何数据库应用程序,首先使用Firefox的Sqlite Manager插件创buildsqlite数据库,并将其放入/ res / raw文件夹中。 然后在我的代码中,我检查数据库中是否存在这个应用程序的/数据/数据。 如果没有,我用我的代码复制数据库文件到该目录。

对于你的情况,很难确定确切的原因,而不看你是如何创build你的数据库,以及如何使用它。可能有几个原因的问题得到这个exception。 其他人已经提到了一些问题。 我想提一个。 你可以尝试像这样打开数据库

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

也许,如果你显示你的代码片段,我可以尝试更好的帮助。 那么,我的方法在这里描述,你可以看看是否有帮助。

填充SQLite数据库

我遇到了这个问题。

我的一个应用程序的行为方式是一样的,因为我添加了代码来将数据库从资产复制到启动屏幕上的指定位置(应用程序启动时可见的屏幕,几秒钟后自动closures视图)。

而在less数情况下发生的情况是,数据库没有在指定的时间框架中被复制,并且从应用程序中访问数据库导致exception。

我做了什么,

我只写了代码在后台线程上复制数据库,并向用户显示启animation面,直到显示下一个画面之后才复制时间数据库。

如果应用程序安装在以前的版本上,可能会有另一种解决scheme,如果需要进行数据防护,并且新版本包含与以前版本不同的模型,则编写代码以将保存的数据从先前版本的应用程序复制到新的vesrion 。

重新安装应用程序,并尝试使用同步块进行数据库CURD操作:)