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

私は常に以下の手順に従って、アセットフォルダからデータベースをコピーします。

  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;

}
于 2012-06-22T14:12:15.703 に答える
1

同様の問題が発生しています。違いは、データベースがEclipse Nexus 7エミュレーターで機能しますが、Nexus7自体では機能しないことです。Questoidをダウンロードして、アセットフォルダーからコピーした後、データベースの内容を確認できるようにしましたが、しばらくの間、データベースがファイルエクスプローラーに表示されませんでした。私はコピーを続けました、そして最終的にそれは現れました。同じプロセスを何度か繰り返しましたが、最小公分母が何であるかをまだ理解できていませんが、私の場合は繰り返しが重要なようです。デバイスにアプリをインストールしたときに、Nexus7自体がデータベースを開くことができない理由を理解する必要があります。同じ例外が発生しますが、デバイス自体でのみ発生します。

于 2012-11-30T17:06:57.023 に答える