我想在数据目录中为应用创建数据库。我试着用
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>
这种用法有什么问题?
答案 0 :(得分:0)
这种用法有什么问题?
永远没有硬编码路径。 /data/data
对许多用户来说都是错误的。 Use getDatabasePath()
获取数据库文件应该在内部存储上的位置。这也将解决使用字符串连接来构建路径的问题。
那会给你:
try {
database = SQLiteDatabase.openOrCreateDatabase(getDatabasePath("Einkaufsliste.sqlite"), null);
}
假设从Context
的子类中的方法调用此代码。否则,您需要安排在getDatabasePath()
上致电Context
。
我设置了EXTERNAL Storage权限
如果这意味着您有WRITE_EXTERNAL_STORAGE
,那么这里没关系,因为您没有将数据库放在外部存储上
和小组许可
我不知道这意味着什么,抱歉。
另外,请考虑使用SQLiteOpenHelper
,以便能够随时间处理数据库架构更改。