[英]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/
. 当我签入
ddms
, data/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";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.