&引用;SQLiteException:无法打开数据库文件";在首次将.apk文件上传到市场后(Android 2.3.5)

&引用;SQLiteException:无法打开数据库文件";在首次将.apk文件上传到市场后(Android 2.3.5),android,sqlite,Android,Sqlite,编辑:该应用程序正在Android 2.3.5版手机上崩溃 我昨天在Google Play上上传了我的第一个应用程序,今天我收到了错误报告,内容如下: android.database.sqlite.SQLiteException: unable to open database file at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) at android.database.sqlite.SQLiteDatabas

编辑:该应用程序正在Android 2.3.5版手机上崩溃

我昨天在Google Play上上传了我的第一个应用程序,今天我收到了错误报告,内容如下:

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:1956)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:918)
at com.hazcheck.dgl.data.ExternalDBOpenHelper.openDataBase(ExternalDBOpenHelper.java:96)
at com.hazcheck.dgl.SearchActivity.afterTextChanged(SearchActivity.java:284)
at android.widget.TextView.sendAfterTextChanged(TextView.java:6566)
at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:6989)
at android.text.SpannableStringBuilder.sendTextHasChanged(SpannableStringBuilder.java:897)
at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:353)
at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:269)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:432)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:409)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:28)
at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:679)
at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:185)
at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:120)
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:332)
at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:86)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:4268)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
1) 哪一个是您在这一行所指的数据库:
com.hazcheck.dgl.SearchActivity.afterTextChanged(SearchActivity.java:284)
?相应的数据库是否存在?您是否在OnCreate()方法中实例化/创建了数据库?如果不是,那就是你的错误。你可能在你的设备上测试了这个应用程序,在那里你只是第一次创建它;即使您更换了应用程序包,应用程序也会重新使用数据库

2) 关于“1错误报告,而0安装”,这也发生在我的应用程序上。更新安装数量的过程可能是周期性的,而更新错误日志则是即时的

    > String outFileName = DB_PATH + DB_NAME;
这可能是一个问题,具体取决于应用程序是安装在sd卡上还是手机内存中

DatabaseContext
及其decentant(如
Activity
)有一个方法

    File getDatabasePath(String name)

这将为您提供正确的目录。

我发现问题出在数据库本身,它是使用旧的Sqlite版本创建的。现在,我使用了Sqlite 3.7.11并重新创建了数据库,现在它工作得很好。

在我的例子中,当我使用databaseInstance以这种方法打开数据库时

private static boolean openDB(String dbPathWithName) {
        boolean status = true;
        try {
            if (databaseInstance == null || !databaseInstance.isOpen()){
                databaseInstance = SQLiteDatabase.openDatabase(dbPathWithName, null, SQLiteDatabase.OPEN_READWRITE + SQLiteDatabase.CREATE_IF_NECESSARY);

            }
        } catch (Exception ex){
            status = false;
            NGAndroidUtil.logErr("DataHelper", ex.getMessage(), ex);
        }
        return status;
    }

在这个例子中,它抛出异常“无法打开数据库”…在这个例子中,我没有给出正确格式的数据库路径,这就是它抛出异常的原因“无法打开数据库…请确保要打开的数据库路径格式正确。

RU是否复制到SD卡?如果SD卡不存在,意味着你在做什么?Ru正在SDCard中创建文件夹(mkdir)?你确定在搜索之前已经完成了数据库的复制吗?我在不同的设备和不同的Android版本上测试了该应用程序,然后将其上传到市场上,它一直运行良好。如果有人有安卓手机也可以尝试,在谷歌Play中查找“DGL”一词并安装带有红色H菱形图标的应用程序。你是否尝试一步一步地调试该应用程序(使用正在崩溃的设备)?这可能会显示应用程序被卡住的位置,n最终找到/纠正错误。@SamSPICA:你说得很好,但我对Android编程非常陌生,不知道如何用实际设备、文章或博客调试它?我还想用一个2.3.5版本的Android模拟器来测试它,但是没有办法安装这个版本!my copyDataBase函数的作用是,如果文件尚未存在,则使用DB_PATH+DB_NAME创建一个新文件,这是第一次运行时的情况。然后解压原始文件夹中的压缩数据库,并将其内容移动到新创建的文件中。数据库路径为DB_path=String.format(“//data//data//%s//databases//”,packageName);谢谢你的帮助。我试过你的解决办法,但没用。还有其他建议吗?afterTextChanged调用一个方法搜索,如果尚未实例化数据库,则实际实例化该数据库,然后打开数据库ExternalDBOpenHelper dbOpenHelper=new ExternalDBOpenHelper(getBaseContext());实际上我并没有在onCreate()中实例化它。IMHO,最好在onCreate()存根中创建一个数据库实例,以避免任何进一步的问题。创建一个私有字段db变量可能会很有成效。我应用了您告诉我的内容,并将其发送给了测试人员,我希望它能正常工作。另一件事,目前市场上的一个没有在一个HTC WildFire上工作,但在另一个类似的设备HTC WildFire上工作,很奇怪。我已经编辑了我的问题,并添加了另一个用于读取数据库的功能。测试完成后,它在一些手机上仍然失败,在其他手机上仍然有效。我不明白这个问题。。。我们还在两个HTC WildFire(完全相同)上试用了它,它在一个上有效,但在另一个上失败了。还有什么想法吗?有没有可能在应用程序失败的地方发布日志,这样我们就可以了解到底出了什么问题?在emulator上运行但不在设备上运行的应用程序很常见,但在同一品牌的两台设备上的不一致性令人困惑。
private static boolean openDB(String dbPathWithName) {
        boolean status = true;
        try {
            if (databaseInstance == null || !databaseInstance.isOpen()){
                databaseInstance = SQLiteDatabase.openDatabase(dbPathWithName, null, SQLiteDatabase.OPEN_READWRITE + SQLiteDatabase.CREATE_IF_NECESSARY);

            }
        } catch (Exception ex){
            status = false;
            NGAndroidUtil.logErr("DataHelper", ex.getMessage(), ex);
        }
        return status;
    }