Android 无法使用SqliteAsselPer类复制数据库

Android 无法使用SqliteAsselPer类复制数据库,android,android-sqlite,android-assets,Android,Android Sqlite,Android Assets,我正在扩展SQLiteAssetHelper类以使用资产文件夹中预填充的数据库,但我的应用程序崩溃,并给出了一个错误,原因是:android.database.sqlite.SQLiteCantOpenDatabaseException:未知错误(代码14):无法打开数据库 当我签入ddms时,data/data/com.sqlitetospinner1/中没有数据库文件夹或我的db文件。为了进行测试,我创建了一个名为databases的文件夹,并将db文件推入其中。此后,应用程序开始完美运行。

我正在扩展
SQLiteAssetHelper
类以使用资产文件夹中预填充的数据库,但我的应用程序崩溃,并给出了一个错误,原因是:android.database.sqlite.SQLiteCantOpenDatabaseException:未知错误(代码14):无法打开数据库

当我签入
ddms
时,
data/data/com.sqlitetospinner1/
中没有数据库文件夹或我的
db
文件。为了进行测试,我创建了一个名为databases的文件夹,并将db文件推入其中。此后,应用程序开始完美运行。

这意味着我的
AssetHelper
类无法复制数据库

AssetHelper
类:-

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;
}

资产中缺少数据库/mydb.sqlite文件(或.zip、.gz存档),或目标文件夹不可写

您的
资产/databases
文件夹中是否有数据库文件

否,仅在资产文件夹中

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

在包资源管理器中的数据库文件上单击鼠标右键

&单击属性

资源选项卡内,确保为“所有者”检查了“写入”权限,并为所有“用户”检查了“读取”权限


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

还要确保指定了正确的数据库名称,因此,如果文件名为data.db,则数据库名称应为data.db

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

    private static final String DATABASE_NAME = "data.db";
或者,如果您正在使用房间:

public abstract class AppDatabase extends RoomDatabase {

    private static AppDatabase INSTANCE;

    @VisibleForTesting
    public static final String DATABASE_NAME = "data.db";
  • 错误:“缺少数据库/EDMTQuiz2019.db文件”
  • 原因:我的文件夹命名不正确。。。 是资产/数据库, 而不是资产/数据库
  • 解决方案:我通过重构/重命名文件夹解决了我的问题 “数据库”到“数据库”
  • 摘要:新的正确路径是资产/数据库(数据库文件夹中有.db文件)

  • 请发布整个堆栈跟踪。另外,您的预打包数据库是否位于
    assets/
    的正确位置?LogCat中是否有其他值得注意的消息?@commonware添加了
    LogCat
    资产中缺少数据库/mydb.sqlite文件(或.zip.gz存档),或者目标文件夹不可写
    您的
    资产/数据库
    文件夹中是否有数据库文件?@laalto否,仅在
    assets
    文件夹中安装您的应用程序,这样您就可以开始使用干净的内部存储。然后再跑一遍。如果它崩溃,发布新的堆栈跟踪,因为它是不同的,或者您的项目中没有
    资产/数据库
    中的
    mydb.sqlite
    。添加到
    数据库
    文件夹中,但没有任何更改仍然相同错误重建并重新安装应用程序,并确保其
    资产/数据库/mydb.sqlite
    (或具有相同前缀的存档文件)我无法解决此问题..我只将.zip文件放在了正确的路径上
    public abstract class AppDatabase extends RoomDatabase {
    
        private static AppDatabase INSTANCE;
    
        @VisibleForTesting
        public static final String DATABASE_NAME = "data.db";