【发布时间】:2014-10-18 14:40:22
【问题描述】:
我正在扩展 SQLiteAssetHelper 类以使用资产文件夹中预填充的数据库,但我的应用程序崩溃并给出了错误提示 Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database。
当我签入ddms 时,data/data/com.sqlitetospinner1/ 中没有数据库文件夹或我的db 文件。所以为了测试,我创建了一个名为 databases 的文件夹并将 db 文件推送到其中。在此之后,应用程序开始完美运行。
这意味着我的AssetsHelper 类复制数据库失败。
AssetsHelper类:-
public class AssetsHelper extends SQLiteAssetHelper {
private static final String DATABASE_NAME = "mydb.sqlite";
private static final int DATABASE_VERSION = 1;
public AssetsHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public List<String> getAllColleges(){
List<String> colleges = new ArrayList<String>();
// Select All Query
String selectQuery = "SELECT * FROM colleges_list ORDER BY Organization_Name";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
colleges.add(cursor.getString(1));
} while (cursor.moveToNext());
}
// closing connection
cursor.close();
db.close();
// returning colleges
return colleges;
}
LogCat:-
08-25 08:41:21.927: W/SQLiteAssetHelper(27504): copying database from assets...
08-25 08:41:22.107: E/SQLiteAssetHelper(27504): Couldn't open mydb.sqlite for writing (will try read-only):
08-25 08:41:22.107: E/SQLiteAssetHelper(27504): com.readystatesoftware.sqliteasset.SQLiteAssetHelper$SQLiteAssetException: Missing databases/mydb.sqlite file (or .zip, .gz archive) in assets, or target folder not writable
08-25 08:41:22.107: E/SQLiteAssetHelper(27504): at android.content.res.AssetManager.openAsset(Native Method)
08-25 08:41:22.107: E/SQLiteAssetHelper(27504): at android.content.res.AssetManager.open(AssetManager.java:316)
08-25 08:41:22.107: E/SQLiteAssetHelper(27504): at android.content.res.AssetManager.open(AssetManager.java:290)
08-25 08:41:22.107: E/SQLiteAssetHelper(27504): at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.copyDatabaseFromAssets(SQLiteAssetHelper.java:436)
08-25 08:41:22.107: E/SQLiteAssetHelper(27504): at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.createOrOpenDatabase(SQLiteAssetHelper.java:400)
08-25 08:41:22.107: E/SQLiteAssetHelper(27504): at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getWritableDatabase(SQLiteAssetHelper.java:176)
08-25 08:41:22.107: E/SQLiteAssetHelper(27504): at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getReadableDatabase(SQLiteAssetHelper.java:254)
08-25 08:41:22.107: E/SQLiteAssetHelper(27504): at com.crm.AssetsHelper.getAllColleges(AssetsHelper.java:38)
08-25 08:41:22.107: E/SQLiteAssetHelper(27504): at dalvik.system.NativeStart.main(Native Method)
08-25 08:41:22.117: E/SQLiteLog(27504): (14) cannot open file at line 30191 of [00bb9c9ce4]
08-25 08:41:22.117: E/SQLiteLog(27504): (14) os_unix.c:30191: (2) open(/data/data/com.sqlitetospinner1/databases/mydb.sqlite) -
08-25 08:41:22.167: E/SQLiteDatabase(27504): Failed to open database '/data/data/com.sqlitetospinner1/databases/mydb.sqlite'.
08-25 08:41:22.167: E/SQLiteDatabase(27504): android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
08-25 08:41:22.167: E/SQLiteDatabase(27504): at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
08-25 08:41:22.167: E/SQLiteDatabase(27504): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209)
08-25 08:41:22.167: E/SQLiteDatabase(27504): at com.crm.AssetsHelper.getAllColleges(AssetsHelper.java:38)
【问题讨论】:
-
请发布整个堆栈跟踪。另外,您的预打包数据库是否位于
assets/的正确位置? LogCat 中是否还有其他值得注意的消息? -
@CommonsWare 添加了
LogCat -
Missing databases/mydb.sqlite file (or .zip, .gz archive) in assets, or target folder not writableassets/databases文件夹中有数据库文件吗? -
@laalto no,仅在
assets文件夹中 -
卸载您的应用程序,以便您从干净的内部存储开始。然后再次运行你的。如果它崩溃,请发布新的堆栈跟踪,因为它可能不同,或者您的项目中的
assets/databases/中没有mydb.sqlite。
标签: android android-sqlite android-assets