[英]SQLITE error Unable to open file
I want to create a database for an app in the data directory. 我想在数据目录中为应用创建数据库。 I tried to use
我尝试使用
try{
String path = "/data/data/"+context+"/database/Einkaufsliste.sqlite";
database = SQLiteDatabase.openOrCreateDatabase(path,null);
}
But I get always the following exception: unable to open database file 但是我总是收到以下异常:无法打开数据库文件
Logcat gives the following result: Logcat给出以下结果:
04-10 19:55:09.387: E/SqliteDatabaseCpp(554): sqlite3_open_v2("/data/data/at.einkaufsliste/database/Einkaufsliste.sqlite", &handle, 6, NULL) failed 04-10 19:55:09.527: E/SQLiteDatabase(554): Failed to open the database.
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):无法打开数据库。 closing it.
关闭它。 04-10 19:55:09.527: E/SQLiteDatabase(554): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file 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.MainA
04-10 19:55:09.527:E / SQLiteDatabase(554):android.database.sqlite.SQLiteCantOpenDatabaseException:无法打开数据库文件04-10 19:55:09.527:E / SQLiteDatabase(554):位于android.database。 sqlite.SQLiteDatabase.dbopen(本机方法)04-10 19:55:09.527:E / SQLiteDatabase(554):位于android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1013)04-10 19:55:09.527 :E / SQLiteDatabase(554):位于android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)04-10 19:55:09.527:E / SQLiteDatabase(554):位于android.database.sqlite.SQLiteDatabase。 openDatabase(SQLiteDatabase.java:962)04-10 19:55:09.527:E / SQLiteDatabase(554):位于android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1043)04-10 19:55:09.527: E / SQLiteDatabase(554):位于at.einkaufsliste.Database.createOrOpen(Database.java:33)04-10 19:55:09.527:E / SQLiteDatabase(554):位于at.einkaufsliste.Database。(Database.java: 23)04-10 19:55:09.527:E / SQLiteDatabase(554):at.einkaufsliste.MainA ctivity.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(ActivityThr
ctivity.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):位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)04-10 19:55:09.527:E / SQLiteDatabase(554):位于android.app.ActivityThread.performLaunchActivity(ActivityThread.java :1920)04-10 19:55:09.527:E / SQLiteDatabase(554):位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)04-10 19:55:09.527:E / SQLiteDatabase(554):在android.app.ActivityThread.access $ 600(ActivityThread.java:123)04-10 19:55:09.527:E / SQLiteDatabase(554):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1147)04 -10 19:55:09.527:E / SQLiteDatabase(554):在android.os.Handler.dispatchMessage(Handler.java:99)04-10 19:55:09.527:E / SQLiteDatabase(554):在android.os .Looper.loop(Looper.java:137)04-10 19:55:09.527:E / SQLiteDatabase(554):位于android.app.ActivityThread.main(ActivityThr ead.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(Native Method)
ead.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):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)04-10 19:55:09.527: E / SQLiteDatabase(554):位于dalvik.system.NativeStart.main(本机方法)
I set the permission EXTERNAL Storage and the group permisson. 我设置了权限EXTERNAL Storage和组权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<permission-group android:name="android.permission-group.STORAGE"></permission-group>
What is wrong with this usage? 这种用法有什么问题?
What is wrong with this usage?
这种用法有什么问题?
NEVER HARDCODE PATHS . 绝不困难的路径 。
/data/data
is wrong for many users. /data/data
对许多用户来说是错误的。 Use getDatabasePath()
to get the location where a database file should go on internal storage. 使用
getDatabasePath()
获取数据库文件应在内部存储器上放置的位置。 This will also fix your problems with using string concatenation to build a path. 这也可以解决使用字符串连接构建路径的问题。
That would give you: 那会给你:
try {
database = SQLiteDatabase.openOrCreateDatabase(getDatabasePath("Einkaufsliste.sqlite"), null);
}
assuming that this code is called from a method in a subclass of Context
. 假定此代码是从
Context
的子类中的方法调用的。 Otherwise, you will need to arrange to call getDatabasePath()
on a Context
. 否则,您将需要安排在
Context
上调用getDatabasePath()
。
I set the permission EXTERNAL Storage
我设置了权限EXTERNAL Storage
If by this you mean that you have WRITE_EXTERNAL_STORAGE
, that does not matter here, as you are not putting the database on external storage 如果您的意思是说您拥有
WRITE_EXTERNAL_STORAGE
,则在这里没关系,因为您没有将数据库放在外部存储上
and the group permisson
和团体许可证
I have no idea what that means, sorry. 我不知道那意味着什么,对不起。
Also, please consider using SQLiteOpenHelper
, to be able to handle database schema changes over time. 另外,请考虑使用
SQLiteOpenHelper
,以便能够随时间处理数据库架构更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.