SQLite返回错误代码14

时间:2011-09-06 07:13:04

标签: android database android-sqlite

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

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)

有关如何解决此问题的任何建议?

11 个答案:

答案 0 :(得分:8)

这可能有点晚了,但希望这有助于谁遇到这个问题(因为我无法找到明确的解决方案)。

我想我知道这个原因的原因(至少在我的情况下)。查看 DDMS - &gt;文件浏览器 ,你会发现数据库文件夹(/ data / data // databases /)不存在,这就是应用程序无法创建数据库文件的原因在那个不存在的文件夹中。如果您可以以某种方式创建数据库文件夹,则可以避免此问题。

因为我很懒,所以当我处于模拟器模式时,我只使用了 / data / data // files / folder 。你可以使用这个获取文件目录:

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集成)在Emulator和/ databases文件夹之后出现(并保持)。不确定发生了什么,但有可能以某种方式创建该文件夹。在这里为另一位专家提供了解决方案。

答案 1 :(得分:6)

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

答案 2 :(得分:6)

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

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

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

应用程序现在运行得很漂亮。

答案 3 :(得分:6)

我遇到了同样的问题。

什么解决了,正在取代

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

String myPath = myContext.getFilesDir().getAbsolutePath().replace("files",
"databases")+File.separator + DB_NAME;

答案 4 :(得分:3)

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

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

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

事实证明,如果我编辑了清单文件,它就摆脱了错误! 在我的清单中,我输入了错误的min sdk版本。我发现这是因为在清单文件中,代码左栏有一个感叹号指示器告诉我我的错误。

为了彻底,我建议你应该确保所有错误/惊叹都已修复,这样你至少可以排除它们。

似乎这个错误(在eclipse中还有更多)可能会发生,具体取决于很多因素!哦,快乐!

答案 5 :(得分:3)

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

  1. 在模拟器的设置选项中,单击“应用程序”
  2. 转到管理应用程序
  3. 找到您的应用,然后点击卸载
  4. 然后再次从Eclipse运行您的应用程序。

答案 6 :(得分:2)

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

答案 7 :(得分:2)

解决了这个谜,在没有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();
}

之后,进行操作。祝你好运!

答案 8 :(得分:2)

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

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

SQLiteDatabase db=getWritableDatabase();
db.close();

答案 9 :(得分:2)

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

答案 10 :(得分: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);