我的应用程序使用未捕获的异常处理程序,在应用程序崩溃时将堆栈跟踪发送给我。我经常从随机用户那里得到这份报告。
我无法复制它,数据库的打开总是在我的情况下成功。这不是存储在外部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 :(得分:5)
答案 1 :(得分:2)
可能发生这种情况的一种可能情况 - 当您从多个线程访问数据库文件时,以及当您尝试打开文件以从另一个线程进行修改时,其中一个线程锁定了该文件。
答案 2 :(得分:2)
如果您的应用程序同时从多个线程打开数据库,则可能是此异常的原因。
请尝试使用synchronized方法打开database.synchronized方法,不允许数据库同时从多个线程打开。 将下面的代码放在你的dbHelper
中private synchronized SQLiteDatabase getWritableDB() {
//get your database and return it from this method.
}
并在获取db时调用这些方法。 希望它会有所帮助。
答案 3 :(得分:0)
@yuku
我遇到过这种问题,我已经像这样解决了这个问题。
我们需要检查Old 数据库是否与新数据库相同,如果某些内容已更改为新数据库,那么我们需要删除旧数据库并安装新数据库或根据新数据库
第二个选项很简单卸载旧应用程序,而不是安装新应用程序
希望这对你有用.. !!!
答案 4 :(得分:0)
对于任何数据库应用程序,我首先使用Firefox的Sqlite Manager插件创建sqlite数据库,并将其放在/ res / raw文件夹中。然后在我的代码中,我检查数据库是否存在于此应用程序的/ data / data中。如果没有,我用我的代码将db文件复制到该目录。
对于您的情况,如果没有看到您创建数据库的方式以及如何使用它,很难确定确切的原因。获得此异常的问题可能有几个原因。其他人已经提到过一些问题。我想提一个。你能尝试像这样打开数据库吗?
SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
如果你展示你的代码片段,我可能会更好地帮助你。好吧,我的方法在这里有描述,你可以看看是否有帮助。
答案 5 :(得分:0)
我遇到过这个问题。
我的一个应用程序以相同的方式运行,因为我添加了代码以将数据库从资产复制到启动屏幕上的指定位置(当应用程序启动时可见的屏幕并在几秒钟后自动离开视图)
在少数情况下发生的情况是,数据库未在指定的时间范围内被复制,并且从应用程序内部访问数据库导致异常。
我做了什么,
我刚刚编写了代码来在后台线程上复制数据库并向用户显示启动画面,直到只有在显示下一个屏幕后才复制时间数据库。
如果应用程序安装在以前的版本上,可能会有另一个解决方案,如果需要数据防护并且新版本包含不同的模型,请编写代码以将保存的数据从先前版本的应用程序复制到新版本以前的版本。
答案 6 :(得分:0)
重新安装应用程序并尝试对数据库 CURD 操作使用synchronized块:)