0

SQLiteDatabase rawQueryからカーソルを取得しようとしていますが、取得し続けjava.lang.IllegalStateExceptionます。正確には、この例外は次のとおりです。

    02-05 19:30:25.100: E/AndroidRuntime(338): java.lang.RuntimeException: Unable to start activity ComponentInfo{frisbeergolf.gui/frisbeergolf.gui.Hole}: java.lang.IllegalStateException: attempt to acquire a reference on a close SQLiteClosable

(以下に同封の完全なログ)

これは、SQLiteOpenHelperクラス内の私のメソッドです。

    public int[] getAllPlayersInGame(Game game){
    SQLiteDatabase db = this.getReadableDatabase();
    int count = this.getNumberOfPlayersInGame(game);
    int[] playerIDs = new int[count];

    Boolean b = db.isOpen();

    Cursor cursor = null;
    cursor = db.rawQuery("SELECT playerID FROM " + gamesTable + " WHERE gameID = " + game.getGameId(), null);

    cursor.moveToFirst();

    for (int i = 0; i < count; i++) {
        playerIDs[i] = cursor.getInt(0);
        cursor.moveToNext();
    }
    cursor.close();
    db.close();

    return playerIDs;
}

データベースが開いているかどうかを確認するためにブール値を作成しました。そして、falseを返します。

誰かが私に理由を教えてもらえますか?

完全なエラーログ:

    02-05 19:30:25.080: W/dalvikvm(338): threadid=3: thread exiting with uncaught      exception (group=0x4001b188)
    02-05 19:30:25.080: E/AndroidRuntime(338): Uncaught handler: thread main exiting due to uncaught exception
    02-05 19:30:25.100: E/AndroidRuntime(338): java.lang.RuntimeException: Unable to start activity ComponentInfo{frisbeergolf.gui/frisbeergolf.gui.Hole}: java.lang.IllegalStateException: attempt to acquire a reference on a close SQLiteClosable
    02-05 19:30:25.100: E/AndroidRuntime(338):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at android.app.ActivityThread.access$2200(ActivityThread.java:119)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at android.os.Handler.dispatchMessage(Handler.java:99)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at android.os.Looper.loop(Looper.java:123)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at android.app.ActivityThread.main(ActivityThread.java:4363)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at java.lang.reflect.Method.invokeNative(Native Method)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at java.lang.reflect.Method.invoke(Method.java:521)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at dalvik.system.NativeStart.main(Native Method)
    02-05 19:30:25.100: E/AndroidRuntime(338): Caused by: java.lang.IllegalStateException: attempt to acquire a reference on a close SQLiteClosable
    02-05 19:30:25.100: E/AndroidRuntime(338):  at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:31)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:56)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1221)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1194)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at frisbeergolf.database.DBHandler.getAllPlayersInGame(DBHandler.java:175)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at frisbeergolf.database.DBHandler.getProgressAtHole(DBHandler.java:226)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at frisbeergolf.game.Game.getProgressAtHole(Game.java:63)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at frisbeergolf.gui.Hole.onCreate(Hole.java:31)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    02-05 19:30:25.100: E/AndroidRuntime(338):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
    02-05 19:30:25.100: E/AndroidRuntime(338):  ... 11 more
4

2 に答える 2

0

It was my own fault all the time.

I called, and closed a database in my this.getNumberOfPlayersInGame(game); method. Hence also closing the newly opened one.

The solution was just to switch these lines to this order and all worked just fine

    int count = this.getNumberOfPlayersInGame(game);
    SQLiteDatabase db = this.getReadableDatabase();
于 2013-02-07T19:52:49.427 に答える
0

コードを投稿していただければ、あなたのコードを使用した例を示すことができますが、私自身のコードをいくつか使用して、問題を解決できることを願っています。

https://bitbucket.org/XatikGroup/droiddraw/src/8aee6ffc4a7d089714c5003e32f29652eafd79ef/DroidDrawClient/src/com/xatik/app/droiddraw/client/databases/CommandsDbAdapter.java?at=master

あなたが電話したときの「これ」が何であるかは完全にはわかりません

this.getReadableDatabase();

私のクラスを見ると、DbAdapter 内にプライベートな静的クラスがあります。このクラスは、データベースを開くのに役立ちます。これがコード内の問題の原因だと思います。

データが必要なアクティビティ内で、CommandsDbAdapter のオブジェクトを作成し、open() 関数を呼び出します。

CommandsDbAdapter cmdDbAdapter = new cmdDbAdapter(this);
cmdDbAdapter.open();
List<Command> commands = cmdDbAdapter.fetchCommandsForScript(1);
cmdDbAdapter.close();

SQLiteOpenHelper を拡張しているクラスにコードの問題があると想定しています。コード全体を貼り付けるか、投稿したコードを分析して何が違うかを確認してください。

于 2013-02-05T21:04:21.307 に答える