4

在我的应用程序中,我的资产文件夹中有一个 SQLite 数据库的副本。据我所知,它工作正常。当我的应用程序第一次在我的模拟器中安装时,我收到如下错误:

Failed to open the database. Closing it.

android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file
E/SQLiteDatabase(7516): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
E/SQLiteDatabase(29308):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1013)
E/SQLiteDatabase(29308):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)
E/SQLiteDatabase(29308):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:962) 
E/SQLiteDatabase(29308):  at com.guayama.database.URLDatabaseHelper.checkDBExists(URLDatabaseHelper.java:86) 
E/SQLiteDatabase(29308):  at com.guayama.database.URLDatabaseHelper.createURLDB(URLDatabaseHelper.java:54)
E/SQLiteDatabase(29308):  at com.guayama.database.URLDatabaseHelper.<init>(URLDatabaseHelper.java:38)

这是我打开数据库的初始代码:

 SQLiteDatabase.openDatabase(mPath, null,SQLiteDatabase.CREATE_IF_NECESSARY);

这是我尝试的另一种方法:

checkDB = SQLiteDatabase.openDatabase(mPath, null,
                SQLiteDatabase.OPEN_READONLY);

我也试过用这个:

 SQLiteDatabase.openDatabase(mPath, null,SQLiteDatabase.NO_LOCALIZED_COLLATORS);

关于如何解决这个问题的任何建议?

4

2 回答 2

2

I always follow below step to copy my database from assets folder:

  private void copyDatabase() throws IOException{

        InputStream inputStream = context.getAssets().open(DB_NAME);
        String dbCreatePath = DB_PATH+DB_NAME;
        OutputStream outputStream = new FileOutputStream(dbCreatePath);
        byte[] buffer = new byte[1024];
        int length;
        while((length = inputStream.read(buffer))>0){
            outputStream.write(buffer,0,length);
        }
        outputStream.flush();
        outputStream.close();
        inputStream.close();
}

Once it is copied i will check like below :

  private boolean checkDatabase(){
    SQLiteDatabase checkDB = null;
    try {
        String dbPath = DB_PATH+DB_NAME;
        checkDB = SQLiteDatabase.openDatabase(dbPath, null,     
            SQLiteDatabase.OPEN_READWRITE);
    } catch (SQLiteException e) {
        // TODO: handle exception
    }
    if(checkDB!=null){
        checkDB.close();}
    return checkDB != null ? true:false;

}
于 2012-06-22T14:12:15.703 回答
1

我遇到了类似的问题,不同之处在于数据库在我的 Eclipse Nexus 7 模拟器中工作,而不是在 Nexus 7 本身上工作。我下载了 Questoid,以便在我从 assets 文件夹中复制它之后查看我的数据库中的内容,但有一段时间该数据库甚至没有出现在文件资源管理器中。我继续做副本,最后它出现了。多次经历相同的过程后,我还没有弄清楚共同点是什么,但重复似乎是我的关键。现在我仍然需要弄清楚为什么当我在设备上安装应用程序时我的 Nexus 7 本身无法打开数据库。我遇到了同样的异常,但仅在设备本身上。

于 2012-11-30T17:06:57.023 回答