2010-08-25 55 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块数据库凝乳操作:)

相关问题