简体   繁体   English

无法使用SQLiteAssetHelper类复制数据库

[英]unable to copy database using SQLiteAssetHelper class

I am extending SQLiteAssetHelper class to use my pre-populated database from assets folder but my app crashed and gave an error saying Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database . 我正在扩展SQLiteAssetHelper类以使用资产文件夹中的预填充数据库,但我的应用程序崩溃并给出错误提示: Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database

When I checked in ddms , there was no databases folder or my db file in data/data/com.sqlitetospinner1/ . 当我签入ddmsdata/data/com.sqlitetospinner1/没有数据库文件夹或我的db文件。 So to just test, I created a folder named databases and pushed the db file into it. 因此,为了进行测试,我创建了一个名为databases的文件夹,并将db文件推入其中。 After this the app started to work perfectly. 此后,该应用程序开始正常运行。

It means my AssetsHelper class failed to copy database. 这意味着我的AssetsHelper类无法复制数据库。

AssetsHelper class:- 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)

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

Do you have the database file in your assets/databases folder? 您的assets/databases文件夹中是否有assets/databases文件?

no, in assets folder only 不,仅在资产文件夹中

SQLiteAssetHelper expects to find the prepopulated database file in databases folder under assets . SQLiteAssetHelper希望在assets下的databases文件夹中找到预填充的数据库文件。

Right click on your database file in the Package Explorer , Package Explorer中右键点击您的数据库文件,

& click on the Properties. 并单击属性。

inside the Resource Tab make sure the " Write " Permission is Checked for the " Owner " and " Read " Permission is Checked for all the " Users ". 在“ 资源”选项卡中,确保为“ 所有者 ”检查“ 写入 ”权限,并为所有“ 用户 ”检查“ 读取 ”权限。

Make sure you have the db file under assets\\databases folder in your app, in the main folder. 确保您的应用程序的主文件夹中的dbs \\ databases文件夹下有db文件。

Also make sure you have specified the correct database name, so if your file name is data.db, your database name should be data.db. 还要确保指定了正确的数据库名称,因此,如果文件名是data.db,则数据库名称应该是data.db。

public class MyHelperDatabase extends com.readystatesoftware.sqliteasset.SQLiteAssetHelper {

    private static final String DATABASE_NAME = "data.db";

Or if you are using Room: 或者,如果您使用的是Room:

public abstract class AppDatabase extends RoomDatabase {

    private static AppDatabase INSTANCE;

    @VisibleForTesting
    public static final String DATABASE_NAME = "data.db";
  1. Error : "Missing databases/EDMTQuiz2019.db file". 错误 :“缺少数据库/EDMTQuiz2019.db文件”。
  2. Cause : my folder was not named properly... It was assets/database, Instead of assets/databases 原因 :我的文件夹命名不正确...它是资产/数据库,而不是资产/数据库
  3. Solution : I solved mine by refactoring/renaming the folder "database" to "databases" 解决方案 :我通过将文件夹“ database”重构/重命名为“ databases”来解决我的问题
  4. Summary : the new right path is assets/databases (the .db file is in the database folder) 摘要 :新的正确路径是资产/数据库(.db文件在数据库文件夹中)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM