获取SQLiteCantOpenDatabaseException

时间:2012-06-22 13:23:38

标签: android sqlite android-sqlite

在我的应用程序中,我的资产文件夹中有一个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);

有关如何解决此问题的任何建议?

2 个答案:

答案 0 :(得分:2)

我总是按照以下步骤从资源文件夹中复制我的数据库:

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

复制后,我会检查如下:

  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;

}

答案 1 :(得分:1)

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