2

このエラーが発生したユーザーから定期的にレポートを受け取ります。

書き込み可能なデータベースを取得できません。

try {
        //dbOpenHelper is a standard SQLiteOpenHelper
        dbOpenHelper.getWritableDatabase();             
} catch (Exception e) {
        //unable to connect to database.
        return;
}

これは時々起こるだけです。どうなり得るか?修正または回避策はありますか?

4

2 に答える 2

0

getWritableDatabase()の代わりにgetReadableDatabase()を試してください

try {
        //dbOpenHelper is a standard SQLiteOpenHelper
        dbOpenHelper.getReadableDatabase();           
} catch (Exception e) {
        //unable to connect to database.
        return;
}
于 2012-10-25T20:11:17.743 に答える
0

これ以上のことはありません。LogCat を確認する必要があります。あなたはあなたのを閉じていますdbOpenHelperか?

簡単な例を次に示します。

public DatabaseControl open() throws SQLiteException {
    dbHelper = new DatabaseHelper(context);
    database = dbHelper.getWritableDatabase();
    return this;
}

public void close() {
    dbHelper.close();
}

編集 1 - 繰り返しますが、LogCat は取得できないため、これが私の最善の推測です。(最終的には、このアプリケーションを Dev デバイスで実行し、複製してから完全な LogCat 出力を取得することが最善の方法である可能性があります)

DB を持つアクティビティがアクセスされ、適切に処理されているように思えますが、場合によっては、そのアクティビティを実行する代わりに、DB呼び出しが必要なclose()場所でユーザーが戻るボタンを押すことがありますか?onBackPressed()close()

つまり、トラブルシューティングを行うには、@Overrideアクティビティ ライフサイクル メソッド: onPause()onResume()onStart()onStop()、およびDB を追加してアプリケーションをテストするonDestroy()だけです。これを行うと、またはDBを含む必要があるなどの返されるライフサイクルには、onBackPressed()close()onStart()onResume()getWritableDatabase()

ドキュメント (以下を参照) によるとUnable to getWritableDatabase、データベースが適切に閉じられていない限り、実際に取得する方法はありません。また、SQlite コード/構造で何かを変更した場合は、DB バージョン # を更新する必要があることを確認してください。

public SQLiteDatabase getWritableDatabase ()

読み取りと書き込みに使用されるデータベースを作成および/または開きます。これが初めて呼び出されると、データベースが開かれ、onCreate(SQLiteDatabase)、onUpgrade(SQLiteDatabase, int, int) および/または onOpen(SQLiteDatabase) が呼び出されます。

正常に開くと、データベースがキャッシュされるため、データベースへの書き込みが必要になるたびにこのメソッドを呼び出すことができます。(データベースが不要になった場合は、必ず close() を呼び出してください。) 不適切なパーミッションやディスクがいっぱいであるなどのエラーにより、このメソッドは失敗する可能性がありますが、問題が修正されれば、今後の試行は成功する可能性があります。


編集 2

open()最初にandclose()メソッドをどのように呼び出したかを示す必要がありました。申し訳ありません。取得または投稿する場合を除き、開く必要はありませんDatabaseHelper。そのため、処理後すぐに、次に必要になるまで閉じてください。Cursorなどについても同様です。

以下は、データベースにクエリを実行する方法です。すべてを開き、情報を取得し、情報を処理してから、すぐにすべてを閉じます。下記参照:

DatabaseControl control = new DatabaseControl(this);

try {
    database = (new DatabaseHelper(this)).getWritableDatabase();
    DatabaseControl control = new DatabaseControl(DbTestDisplay.this);
    control.open();
    control.fetchAllItems();
    Cursor c = database.query(GlobalDBVars.TABLE_NAME, null, null, null, null, null, null, null);
    c.moveToFirst();

    int initialCount = c.getCount();
    Log.i("cursor", "Initial Count = " + initialCount);

    List<Integer> x = new ArrayList<Integer>();
    if (initialCount > 0) {
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {

            /* Process everything here */

        } /* End for loop */ 
    } /* End if statement */
    control.close();
    c.close();
    database.close();
} catch (SQLException sqe) {
    Log.e("fetchAllItems", "FAILED: " + sqe.getMessage() + " allData = ");
}
于 2012-10-19T20:17:05.753 に答える