SQLITE错误无法打开文件

时间:2014-04-10 19:56:36

标签: android database sqlite

我想在数据目录中为应用创建数据库。我试着用

try{
        String path = "/data/data/"+context+"/database/Einkaufsliste.sqlite";
        database = SQLiteDatabase.openOrCreateDatabase(path,null);
    }

但我总是得到以下异常: 无法打开数据库文件

Logcat给出以下结果:

  

04-10 19:55:09.387:E / SqliteDatabaseCpp(554):   sqlite3_open_v2(" /data/data/at.einkaufsliste/database/Einkaufsliste.sqlite" ;,   & handle,6,NULL)失败04-10 19:55:09.527:E / SQLiteDatabase(554):   无法打开数据库。关闭它。 04-10 19:55:09.527:   E / SQLiteDatabase(554):   android.database.sqlite.SQLiteCantOpenDatabaseException:无法   打开数据库文件04-10 19:55:09.527:E / SQLiteDatabase(554):at   android.database.sqlite.SQLiteDatabase.dbopen(Native Method)04-10   19:55:09.527:E / SQLiteDatabase(554):at   android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1013)   04-10 19:55:09.527:E / SQLiteDatabase(554):at   android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)   04-10 19:55:09.527:E / SQLiteDatabase(554):at   android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:962)   04-10 19:55:09.527:E / SQLiteDatabase(554):at   android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1043)   04-10 19:55:09.527:E / SQLiteDatabase(554):at   at.einkaufsliste.Database.createOrOpen(Database.java:33)04-10   19:55:09.527:E / SQLiteDatabase(554):at   at.einkaufsliste.Database。(Database.java:23)04-10 19:55:09.527:   E / SQLiteDatabase(554):at   at.einkaufsliste.MainActivity.onCreate(MainActivity.java:50)04-10   19:55:09.527:E / SQLiteDatabase(554):at   android.app.Activity.performCreate(Activity.java:4465)04-10   19:55:09.527:E / SQLiteDatabase(554):at   android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)   04-10 19:55:09.527:E / SQLiteDatabase(554):at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)   04-10 19:55:09.527:E / SQLiteDatabase(554):at   android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)   04-10 19:55:09.527:E / SQLiteDatabase(554):at   android.app.ActivityThread.access $ 600(ActivityThread.java:123)04-10   19:55:09.527:E / SQLiteDatabase(554):at   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1147)   04-10 19:55:09.527:E / SQLiteDatabase(554):at   android.os.Handler.dispatchMessage(Handler.java:99)04-10   19:55:09.527:E / SQLiteDatabase(554):at   android.os.Looper.loop(Looper.java:137)04-10 19:55:09.527:   E / SQLiteDatabase(554):at   android.app.ActivityThread.main(ActivityThread.java:4424)04-10   19:55:09.527:E / SQLiteDatabase(554):at   java.lang.reflect.Method.invokeNative(Native Method)04-10   19:55:09.527:E / SQLiteDatabase(554):at   java.lang.reflect.Method.invoke(Method.java:511)04-10 19:55:09.527:   E / SQLiteDatabase(554):at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)   04-10 19:55:09.527:E / SQLiteDatabase(554):at   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)04-10   19:55:09.527:E / SQLiteDatabase(554):at   dalvik.system.NativeStart.main(原生方法)

我设置了EXTERNAL Storage权限和组权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<permission-group android:name="android.permission-group.STORAGE"></permission-group>

这种用法有什么问题?

1 个答案:

答案 0 :(得分:0)

  

这种用法有什么问题?

永远没有硬编码路径/data/data对许多用户来说都是错误的。 Use getDatabasePath()获取数据库文件应该在内部存储上的位置。这也将解决使用字符串连接来构建路径的问题。

那会给你:

try {
    database = SQLiteDatabase.openOrCreateDatabase(getDatabasePath("Einkaufsliste.sqlite"), null);
}

假设从Context的子类中的方法调用此代码。否则,您需要安排在getDatabasePath()上致电Context

  

我设置了EXTERNAL Storage权限

如果这意味着您有WRITE_EXTERNAL_STORAGE,那么这里没关系,因为您没有将数据库放在外部存储上

  

和小组许可

我不知道这意味着什么,抱歉。

另外,请考虑使用SQLiteOpenHelper,以便能够随时间处理数据库架构更改。