17

我正在尝试从我的资产文件夹中复制现有数据库并对其执行一些操作。一切正常,但我的模拟器的日志文件中出现以下错误:

sqlite returned: error code = 14, msg = cannot open file at source line 25467

09-06 11:23:41.844: INFO/Database(22560): sqlite returned: error code = 14, msg = cannot open file at source line 25467
09-06 11:23:41.885: ERROR/Database(22560): sqlite3_open_v2("/data/data/com.dhani.Lazy/databases/LazyDB.sqlite", &handle, 1, NULL) failed
09-06 11:23:41.885: WARN/System.err(22560): android.database.sqlite.SQLiteException: unable to open database file
09-06 11:23:41.894: WARN/System.err(22560):     at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
09-06 11:23:41.904: WARN/System.err(22560):     at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1849)
09-06 11:23:41.914: WARN/System.err(22560):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
09-06 11:23:41.914: WARN/System.err(22560):     at com.dharani.LazyApple.Database.DataBaseHelper.checkDataBase(DataBaseHelper.java:72)
09-06 11:23:41.914: WARN/System.err(22560):     at com.dharani.LazyApple.Database.DataBaseHelper.createDataBase(DataBaseHelper.java:47)
09-06 11:23:41.914: WARN/System.err(22560):     at com.dharani.LazyApple.Database.DataBaseHelper.Login(DataBaseHelper.java:166)
09-06 11:23:41.914: WARN/System.err(22560):     at com.dharani.LazyApple.Views.LoginView$1.onClick(LoginView.java:63)
09-06 11:23:41.934: WARN/System.err(22560):     at android.view.View.performClick(View.java:2485)
09-06 11:23:41.934: WARN/System.err(22560):     at android.view.View$PerformClick.run(View.java:9080)
09-06 11:23:41.944: WARN/System.err(22560):     at android.os.Handler.handleCallback(Handler.java:587)
09-06 11:23:41.944: WARN/System.err(22560):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-06 11:23:41.944: WARN/System.err(22560):     at android.os.Looper.loop(Looper.java:123)
09-06 11:23:41.944: WARN/System.err(22560):     at android.app.ActivityThread.main(ActivityThread.java:3683)
09-06 11:23:41.964: WARN/System.err(22560):     at java.lang.reflect.Method.invokeNative(Native Method)
09-06 11:23:41.964: WARN/System.err(22560):     at java.lang.reflect.Method.invoke(Method.java:507)
09-06 11:23:41.964: WARN/System.err(22560):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
09-06 11:23:41.964: WARN/System.err(22560):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
09-06 11:23:41.964: WARN/System.err(22560):     at dalvik.system.NativeStart.main(Native Method)

关于如何解决这个问题的任何建议?

4

11 回答 11

9

这可能有点晚了,但希望这对遇到这个问题的人有所帮助(因为我找不到明确的解决方案)。

我想我知道这个原因的原因(至少就我而言)。查看DDMS --> File Explorer,您会发现 数据库文件夹 (/data/data//databases/)不存在,这就是应用程序无法在该不存在的文件夹中创建数据库文件的原因。如果您可以通过某种方式创建数据库文件夹,则可以避免此问题。

因为我很懒,所以我在模拟器模式下只使用了/data/data//files/ 文件夹。您可以使用以下方法获取文件目录:

context.getFilesDir().getPath()

这在模拟器中对我来说非常有用。

希望这可以帮助某人。

如果您想查看一些代码:

String dbFilename = "example.db";
try
{       
    File databaseFile = getDatabasePath(dbFilename);        
        SQLiteDatabase _db = SQLiteDatabase.openOrCreateDatabase(databaseFile);
} catch (Exception e)
{
    String databasePath =  getFilesDir().getPath() +  "/" + dbFilename;
    File databaseFile = new File(databasePath); 
    _db = SQLiteDatabase.openOrCreateDatabase(databaseFile);
}

编辑:我尝试在模拟器上登录 Facebook(我的应用程序具有 FB 集成),然后 /databases 文件夹出现(并持续存在)。不知道发生了什么,但有可能以某种方式创建该文件夹。这里有另一位专家可以阐明的东西。

于 2013-08-29T12:38:24.707 回答
6

如果您在清单中使用 sharedUserId,我已经看到会发生此错误。如果您更改应用程序的 sharedUserId 并重新安装该应用程序,则它没有写入 SQLite 数据库所需的所有权。

于 2011-09-06T09:36:24.233 回答
6

今天这个问题花了我3个小时。我尝试了什么:

  • 重写复制数据库代码。
  • 从模拟器/设备中删除应用程序
  • 擦除模拟器
  • 清洁日食
  • 更改文件权限

我通过将代码从共享的 Dropbox 帐户复制到另一个位置并使用另一个包名称重构 Android Manifest 和 java 文件中的代码来解决了这个问题。

该应用程序现在运行良好。

于 2012-12-27T16:12:38.133 回答
6

我有同样的问题。

什么解决了它,正在更换

private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/";

String myPath = myContext.getFilesDir().getAbsolutePath().replace("files",
"databases")+File.separator + DB_NAME;
于 2013-11-28T13:16:31.950 回答
3

我在 logcat 上有相同的错误代码:

sqlite returned: error code = 14, msg = cannot open file at source line

该应用程序会运行良好(实际上我在查看 logcat 之前没有注意到任何问题!)。Logcat 通知我这个错误,所以我认为最好现在解决这个问题。

事实证明,如果我编辑了清单文件,它就摆脱了错误!在我的清单中,我输入了不正确的 min sdk 版本。我发现这一点是因为在清单文件中,代码的左列有一个感叹号,通知我我的错误。

为了彻底,我建议您确保所有错误/感叹号都已修复,以便您至少可以排除它们。

似乎这个错误(以及更多在 Eclipse 中)可能取决于大量因素!哦,快乐!

于 2012-01-28T12:18:10.307 回答
3

或者,另一个对我有用的简单解决方案如下:

  1. 在模拟器的设置选项中,单击应用程序
  2. 转到管理应用程序
  3. 找到您的应用程序,然后单击卸载
  4. 然后再次从 Eclipse 运行您的应用程序。
于 2012-02-14T08:08:19.183 回答
2

我的理由不同:我访问了创建数据库的应用程序的在线版本。然后,PhoneGap 应用程序无法访问由其他应用程序创建的文件。清除浏览器缓存解决了我的问题。

于 2013-02-02T18:27:17.700 回答
2

谜团解开了,在没有DB的模拟器中测试并标记错误,所以你必须先创建DB

    InputStream myInput = myContext.getAssets().open(DB_NAME);

    //Destination folder (where we created the DB empty)
    String outFileName = DB_PATH + DB_NAME;

    //We opened it BBDD Vacia as OutputStream
    OutputStream myOutput = new FileOutputStream(outFileName);

    //Transfers Bytes between input and output Stream
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer))>0){
        myOutput.write(buffer, 0, length);
    }

    //Close the open files
    myOutput.flush();
    myOutput.close();
    myInput.close();
}

之后,做你的操作。祝你好运!

于 2013-07-10T05:41:54.783 回答
2

我设法通过意识到文档有点误导来解决这个问题。您需要有一个与数据库名称相关的压缩资产的文件名。例如,如果您的数据库被调用someData.db,那么您的 zip 文件必须是someData.zip.

此外,如果您尝试打开可写数据库,似乎会有更好的诊断。我在构造函数中做了如下,这最终帮助我找出了解决方案。

SQLiteDatabase db=getWritableDatabase();
db.close();
于 2013-11-16T11:34:56.403 回答
2

确保关闭所有游标和数据库实例。由于进行了多次插入和更新并且没有关闭游标,导致游标泄漏并且无法打开数据库,因此我遇到了此错误。

于 2016-07-04T21:52:06.283 回答
0

在某些设备上不会自动创建数据库目录。您只需要检测丢失的databases目录并创建它:

File databaseFile = getDatabasePath("my.db");

// Create directory when needed
File databaseDir = databaseFile.getParentFile();
if(!databaseDir.exists()) {
    databaseDir.mkdirs();
}

SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile);
于 2020-02-06T12:55:40.237 回答