【问题标题】:unable to copy database using SQLiteAssetHelper class无法使用 SQLiteAssetHelper 类复制数据库
【发布时间】: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


【解决方案1】:
  1. 错误:“缺少数据库/EDMTQuiz2019.db 文件”。
  2. 原因:我的文件夹命名不正确... 它是资产/数据库, 而不是资产/数据库
  3. 解决方案:我通过重构/重命名文件夹解决了我的问题 “数据库”到“数据库”
  4. 总结:新的正确路径是assets/databases(.db文件在database文件夹中)

【讨论】:

    【解决方案2】:

    确保您在应用程序的主文件夹中的 assets\databases 文件夹下有 db 文件。

    还要确保你指定了正确的数据库名,所以如果你的文件名是data.db,你的数据库名应该是data.db。

    public class MyHelperDatabase extends com.readystatesoftware.sqliteasset.SQLiteAssetHelper {
    
        private static final String DATABASE_NAME = "data.db";
    

    或者如果您使用的是 Room:

    public abstract class AppDatabase extends RoomDatabase {
    
        private static AppDatabase INSTANCE;
    
        @VisibleForTesting
        public static final String DATABASE_NAME = "data.db";
    

    【讨论】:

      【解决方案3】:

      Package Explorer中右键单击您的数据库文件,

      & 点击属性。

      Resource 选项卡中,确保检查了“Owner”和“Read”的“Write”权限strong>" 已检查所有“用户”的权限。

      【讨论】:

        【解决方案4】:

        Missing databases/mydb.sqlite file (or .zip, .gz archive) in assets, or target folder not writable

        assets/databases 文件夹中有数据库文件吗?

        不,仅在资产文件夹中

        SQLiteAssetHelper 期望在assets 下的databases 文件夹中找到预填充的数据库文件。

        【讨论】:

        • 已添加到databases 文件夹中,但没有任何改变仍然是同样的错误
        • 重新构建并重新安装应用程序,并确保其 assets/databases/mydb.sqlite(或具有相同前缀的存档)
        • 我无法解决这个问题。我只将 .zip 文件放在正确的路径
        猜你喜欢
        • 1970-01-01
        • 2015-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-12
        相关资源
        最近更新 更多