【问题标题】:Unable to open SQLite database stored at assets\databases using SQLiteAssetHelper无法使用 SQLiteAssetHelper 打开存储在 assets\databases 中的 SQLite 数据库
【发布时间】:2014-09-19 09:28:06
【问题描述】:

我正在尝试使用assets/databases 文件夹中的SQLite database 使用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 问题,但没有一个对我有帮助。

更新:-它以前可以工作,但在我用另一个数据库更改我的数据库文件后它停止工作。

【问题讨论】:

  • 错误:资产或目标文件夹中的数据库/mydb.sqlite.zip 文件不可写在资产文件夹中检查并比较名称。
  • @SilentKiller 我的数据库文件同名,我在模拟器上运行我的代码
  • 资产文件夹中的数据库名称是什么?
  • @SilentKiller mydb.sqlite
  • 您的异常表明您在从 assets 文件夹中获取数据库时正在更改名称。上传您将资产文件夹 DB 复制到设备的代码。 资产或目标文件夹中缺少数据库/mydb.sqlite.zip 文件不可写

标签: android android-sqlite android-assets


【解决方案1】:

根据 cmets 中的诊断,您使用的是旧版本的资产帮助程序库,这导致了问题。

latest jar 链接到项目的github page

【讨论】:

  • 该链接要求提供一些 Sonatype Nexus 存储库用户名和密码。为什么?
【解决方案2】:

您需要将数据库放在 assets/databases 文件夹中。
SQLiteAssetHelper 期望在 assets 下的 databases 文件夹中找到预填充的数据库文件。

所以SQLite的放置会是这样的

assets/  
   databases/  
      mydb.sqlite  

在它重建并重新安装应用程序并确保放置正确之后。

【讨论】:

  • @user1 从第一次开始?您是否已经尝试重建、卸载应用然后重新安装?
  • 是的,仅从第一次开始。我试过了,但没有帮助。
  • @user1 数据库文件夹权限如何?然后是 mydb.sqlite 权限?
猜你喜欢
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
相关资源
最近更新 更多