我正在尝试使用SQLite database
类的assets/databases
文件夹中的SQLiteAssetHelper
,但我收到以下错误: -
09-25 01:34:53.007: E/SQLiteLog(1191): (14) cannot open file at line 30191 of [00bb9c9ce4]
09-25 01:34:53.007: E/SQLiteLog(1191): (14) os_unix.c:30191: (2) open(/data/data/com.sqlitetospinner1/databases/mydb.sqlite) -
09-25 01:34:53.067: E/SQLiteDatabase(1191): Failed to open database '/data/data/com.sqlitetospinner1/databases/mydb.sqlite'.
09-25 01:34:53.067: E/SQLiteDatabase(1191): android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
09-25 01:34:53.067: E/SQLiteDatabase(1191): at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
09-25 01:34:53.067: E/SQLiteDatabase(1191): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209)
09-25 01:34:53.067: E/SQLiteDatabase(1191): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
09-25 01:34:53.067: E/SQLiteDatabase(1191): at com.crm.AssetsHelper.getAllColleges(AssetsHelper.java:37)
09-25 01:34:53.067: E/SQLiteDatabase(1191): at com.crm.Quote_Details.loadSpinnerData(Quote_Details.java:127)
09-25 01:34:53.067: E/SQLiteDatabase(1191): at com.crm.Quote_Details.onCreate(Quote_Details.java:66)
09-25 01:34:53.067: W/SQLiteAssetHelper(1191): could not open database mydb.sqlite - unknown error (code 14): Could not open database
09-25 01:34:53.077: W/SQLiteAssetHelper(1191): copying database from assets...
09-25 01:34:53.207: E/SQLiteAssetHelper(1191): Couldn't open mydb.sqlite for writing (will try read-only):
09-25 01:34:53.207: E/SQLiteAssetHelper(1191): com.readystatesoftware.sqliteasset.SQLiteAssetException: Missing databases/mydb.sqlite.zip file in assets or target folder not writable
09-25 01:34:53.207: E/SQLiteAssetHelper(1191): at android.content.res.AssetManager.openAsset(Native Method)
09-25 01:34:53.207: E/SQLiteAssetHelper(1191): at android.content.res.AssetManager.open(AssetManager.java:316)
09-25 01:34:53.207: E/SQLiteAssetHelper(1191): at android.content.res.AssetManager.open(AssetManager.java:290)
09-25 01:34:53.207: E/SQLiteAssetHelper(1191): at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.copyDatabaseFromAssets(SQLiteAssetHelper.java:376)
09-25 01:34:53.207: E/SQLiteAssetHelper(1191): at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.createOrOpenDatabase(SQLiteAssetHelper.java:355)
09-25 01:34:53.207: E/SQLiteAssetHelper(1191): at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getWritableDatabase(SQLiteAssetHelper.java:178)
09-25 01:34:53.207: E/SQLiteAssetHelper(1191): at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getReadableDatabase(SQLiteAssetHelper.java:257)
09-25 01:34:53.207: E/SQLiteAssetHelper(1191): at com.crm.AssetsHelper.getAllColleges(AssetsHelper.java:37)
09-25 01:34:53.207: E/SQLiteAssetHelper(1191): at com.crm.Quote_Details.loadSpinnerData(Quote_Details.java:127)
09-25 01:34:53.207: E/SQLiteAssetHelper(1191): at com.crm.Quote_Details.onCreate(Quote_Details.java:66)
这是我的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>();
String selectQuery = "SELECT * FROM colleges_list ORDER BY Organization_Name";
// Below is line number 37
SQLiteDatabase db = this.getReadableDatabase(); //Error comes from this line
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
colleges.add(cursor.getString(1));
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return colleges;
}
}
我已经在manifest
中提供了这些权限: -
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
我也经历了很多SO问题,但在我的案例中没有一个问题有用。
答案 0 :(得分:3)
根据评论中的诊断,您使用的是古老版本的资产助手库,这会导致问题。
latest jar与项目的github page相关联。
答案 1 :(得分:1)
您需要将数据库放在assets / databases文件夹中 SQLiteAssetHelper期望在资产下的数据库文件夹中找到预先填充的数据库文件。
所以SQLite的位置就像这样
assets/
databases/
mydb.sqlite
重建并重新安装应用程序并确保放置正确后。