清除应用程序存储和缓存后,开始收到未知错误(代码14 SQLITE_CANTOPEN):无法打开数据库。在清理存储器之前,所有东西都正常工作,无论是模拟器还是设备。
我试着从仿真器、擦除模拟器和清理项目中删除应用程序,但在打开MainActivity时仍然崩溃。为了解决问题,我在AndroidManifest中添加了写入权限,但仍然存在相同的错误。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
而不是做
this.baza_putanja = "/data/data/" + context.getPackageName() + "/" + "databases/";
我做到了
baza_putanja = context.getDatabasePath(baza_ime).getPath();
让我困扰的是,如果我试图使用不包括数据库名称的路径打开数据库--为什么在清除应用程序存储和缓存之前它是工作的?
BazaPodatakaHelper.java
private String baza_putanja = null;
private static final String baza_ime = "eng_dictionary.db";
private SQLiteDatabase econDictionary;
private final Context mContext;
public BazaPodatakaHelper(Context context) {
super(context, baza_ime, null, 1);
this.mContext = context;
this.baza_putanja = "/data/data/" + context.getPackageName() + "/" + "databases/";
Log.e("Putanja 1", baza_putanja);
}
public void kreirajBazuPodataka() throws IOException {
boolean bazaPodatakaPostoji = provjeriBazuPodataka();
if ( !bazaPodatakaPostoji ) {
this.getReadableDatabase();
try {
kopirajBazuPodataka();
} catch (IOException e) {
throw new Error("Greška prilikom kopiranja baze podataka");
}
}
}
public boolean provjeriBazuPodataka() {
SQLiteDatabase provjera;
try {
String putanja = baza_putanja + baza_ime;
provjera = SQLiteDatabase.openDatabase(putanja, null, SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) {
throw new Error("Greška prilikom provjeravanja baze podataka");
}
if (provjera != null) {
provjera.close();
}
return provjera != null;
}
错误日志:
2019-07-17 20:39:30.482 7885-7885/com.benjaminkljn.econdictionary E/Putanja 1: /data/data/com.benjaminkljn.econdictionary/assets/ 2019-07-17 20:39:30.485 7885-7885/com.benjaminkljn.econdictionary E/SQLiteLog: (14) cannot open file at line 36683 of [c255889bd9] 2019-07-17 20:39:30.485 7885-7885/com.benjaminkljn.econdictionary E/SQLiteLog: (14) os_unix.c:36683: (2) open(/data/data/com.benjaminkljn.econdictionary/assets/eng_dictionary.db)
- 2019-07-17 20:39:30.491 7885-7885/com.benjaminkljn.econdictionary E/SQLiteDatabase: Failed to open database '/data/data/com.benjaminkljn.econdictionary/assets/eng_dictionary.db'.
android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14 SQLITE_CANTOPEN): Could not open database
发布于 2019-07-18 00:06:44
信息是说
/data/data/com.benjaminkljn.econdictionary/assets/eng_dictionary.db
上面的代码不包括路径中的,所以您的问题可能就是基于这一点的。
通常,特别是,如果使用context.getDatabasePath(your_database)
,则尝试打开
/data/data/com.benjaminkljn.econdictionary/databases/eng_dictionary.db
此外,在你的评论中你提到:-
>I've deleted and re-imported database
通常情况下,导入数据库(至少是为应用程序导入数据库)会将要导入的数据库(包括在应用程序中)复制到assets文件夹中。
因此,您可能试图从您认为是资产文件夹的地方打开数据库,但是您不能直接使用包含/导入的资产文件夹,因为资产是由AssetsManager.管理的。
您可能可以使用设备资源管理器在/data/data/com.benjaminkljn.econ字典中创建资产文件夹,然后将数据库复制到该文件夹中,然后打开该文件夹即可工作。
如果您以前这样做了,那么在删除/卸载App之后,如果数据库没有手动复制到资产文件夹(因此已经创建了资产文件夹),则会导致您遇到的问题。
但是,手动复制数据库,只适用于特定的应用程序。如果发布了该应用程序,它将无法工作,因为您无法手动复制该文件。
若要在应用程序中使用预先存在的数据库,建议的方法是:
SQliteAssethelper简化了这一点。
https://stackoverflow.com/questions/57082591
复制相似问题