0

数日間苦労しているという問題があります。データベースが閉じられていないというエラーが表示され続けます。sql dbからアイテムを取得し、カスタムアダプターを使用してグリッドビューに配置します。アイテムをクリックすると、別のクラス(answer.java)に移動します。何もせずに戻るボタンを押してもエラーは発生しませんが、特定の関数を呼び出してこの関数の後に戻るボタンを押すと、戻るボタンを押すとclose()エラーが発生します。したがって、これは正確なエラーです。

    11-19 19:56:22.485: E/Database(7403): close() was never explicitly called on database '/data/data/com.test.game/databases/quizDb' 
11-19 19:56:22.485: E/Database(7403): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
11-19 19:56:22.485: E/Database(7403):   at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1847)
11-19 19:56:22.485: E/Database(7403):   at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
11-19 19:56:22.485: E/Database(7403):   at com.test.game.db.DataBaseHelper.openDataBase(DataBaseHelper.java:117)
11-19 19:56:22.485: E/Database(7403):   at com.test.game.Answer.loadDataBase(Answer.java:179)
11-19 19:56:22.485: E/Database(7403):   at com.test.game.Answer.onClick(Answer.java:240)
11-19 19:56:22.485: E/Database(7403):   at android.view.View.performClick(View.java:2491)
11-19 19:56:22.485: E/Database(7403):   at android.view.View$PerformClick.run(View.java:9086)
11-19 19:56:22.485: E/Database(7403):   at android.os.Handler.handleCallback(Handler.java:587)
11-19 19:56:22.485: E/Database(7403):   at android.os.Handler.dispatchMessage(Handler.java:92)
11-19 19:56:22.485: E/Database(7403):   at android.os.Looper.loop(Looper.java:130)
11-19 19:56:22.485: E/Database(7403):   at android.app.ActivityThread.main(ActivityThread.java:3683)
11-19 19:56:22.485: E/Database(7403):   at java.lang.reflect.Method.invokeNative(Native Method)
11-19 19:56:22.485: E/Database(7403):   at java.lang.reflect.Method.invoke(Method.java:507)
11-19 19:56:22.485: E/Database(7403):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:861)
11-19 19:56:22.485: E/Database(7403):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:619)
11-19 19:56:22.485: E/Database(7403):   at dalvik.system.NativeStart.main(Native Method)

このエラーの原因となっているコードの部分を見つけたと思います。answer.javaファイルでmyDbHelper.insertString(...)を呼び出さないと、エラーは発生しなくなります...

public void insertString(int id, int level, String field, String player) {

    Cursor c = myDataBase.rawQuery(
            "SELECT * FROM ANSWERS WHERE QUESTION_ID=" + id
                    + " AND PLAYER ='" + player + "'", null);

    myDataBase = this.getWritableDatabase();

    if (c != null) {
        myDataBase.execSQL("UPDATE ANSWERS SET " + field + "=1"
                + " WHERE QUESTION_ID=" + id + " AND LEVEL =" + level
                + " AND PLAYER='" + player + "'");
    } else {
        myDataBase
                .execSQL("INSERT INTO ANSWERS (level, player, question_id, "
                        + field + ") VALUES ("+ level + ",'" + player + "'," + id + ", 1)");
    }

    c.close();
    if (myDataBase != null) {
        myDataBase.close();

    }

}

私が試したが解決しなかったことの1つは、これをanswer.javaファイルに追加することでした。

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (myDbHelper != null) {
                 myDbHelper.close();
            }
return true;
        }

        return super.onKeyDown(keyCode, event);
    } 

//私のdatabasehelper.javaの.close()は次のとおりです。

@Override
public synchronized void close() {
    if (myDataBase != null)
        myDataBase.close();
    if (c != null)
        c.close();
    super.close();
}

誰かが私に光を見せてくれることを願っています!

編集

@samあなたの解決策は私にこれを与えます:

11-19 19:52:42.735: E/AndroidRuntime(6982): FATAL EXCEPTION: main
11-19 19:52:42.735: E/AndroidRuntime(6982): android.database.sqlite.SQLiteException: attempt to write a readonly database: UPDATE ANSWERS SET showhint1=1 WHERE QUESTION_ID=18 AND LEVEL =1 AND PLAYER='trst'
11-19 19:52:42.735: E/AndroidRuntime(6982):     at android.database.sqlite.SQLiteDatabase.native_execSQL(Native Method)
11-19 19:52:42.735: E/AndroidRuntime(6982):     at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1763)
11-19 19:52:42.735: E/AndroidRuntime(6982):     at com.test.game.db.DataBaseHelper.insertString(DataBaseHelper.java:301)
11-19 19:52:42.735: E/AndroidRuntime(6982):     at com.test.game.Answer.onClick(Answer.java:241)
11-19 19:52:42.735: E/AndroidRuntime(6982):     at android.view.View.performClick(View.java:2491)
11-19 19:52:42.735: E/AndroidRuntime(6982):     at android.view.View$PerformClick.run(View.java:9086)
11-19 19:52:42.735: E/AndroidRuntime(6982):     at android.os.Handler.handleCallback(Handler.java:587)
11-19 19:52:42.735: E/AndroidRuntime(6982):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-19 19:52:42.735: E/AndroidRuntime(6982):     at android.os.Looper.loop(Looper.java:130)
11-19 19:52:42.735: E/AndroidRuntime(6982):     at android.app.ActivityThread.main(ActivityThread.java:3683)
11-19 19:52:42.735: E/AndroidRuntime(6982):     at java.lang.reflect.Method.invokeNative(Native Method)
11-19 19:52:42.735: E/AndroidRuntime(6982):     at java.lang.reflect.Method.invoke(Method.java:507)
11-19 19:52:42.735: E/AndroidRuntime(6982):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:861)
11-19 19:52:42.735: E/AndroidRuntime(6982):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:619)
11-19 19:52:42.735: E/AndroidRuntime(6982):     at dalvik.system.NativeStart.main(Native Method)
4

3 に答える 3

3
Cursor c = myDataBase.rawQuery(
        "SELECT * FROM ANSWERS WHERE QUESTION_ID=" + id
                + " AND PLAYER ='" + player + "'", null);

//Try adding this
myDatabase.close();

myDataBase = this.getWritableDatabase();

編集:以下のように変更してみてください:

myDatabase.close();
myDataBase = this.getWritableDatabase();
Cursor c = myDataBase.rawQuery(
        "SELECT * FROM ANSWERS WHERE QUESTION_ID=" + id
                + " AND PLAYER ='" + player + "'", null);

//move this to before the rawQuery
//myDataBase = this.getWritableDatabase();
于 2012-11-19T18:40:11.723 に答える
2

明らかに、データベースを複数の場所で開きます。

// myDataBase is already open or else this could not work
Cursor c = myDataBase.rawQuery(
        "SELECT * FROM ANSWERS WHERE QUESTION_ID=" + id
                + " AND PLAYER ='" + player + "'", null);

// You are opening myDataBase again
myDataBase = this.getWritableDatabase();

コードを調べて、コードを閉じるのを忘れた場所を探して見つけてgetWritableDatabase()ください。または、データベースに頻繁にアクセスする場合は、アクティビティでデータベースを1回開き、で1回閉じます。getReadableDatabase()onResume()onPause()

于 2012-11-19T18:10:01.463 に答える
0

これはハックほどの答えではありません。ただし、データベースヘルパークラスのopenDatabaseメソッドのにデータベースを近づけてみることができます。次のようなものが機能する可能性があります。

    if (this.db.isOpen()) {
       this.db.close();
    }
于 2012-11-19T17:57:47.220 に答える