web-dev-qa-db-ja.com

java.lang.IllegalStateException:すでに閉じられているオブジェクトを再度開こうとする(閉じようとした)

_public int getRecordsCount() {
        String countQuery = "SELECT  * FROM " + TABLE_LOGIN;

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        if(cursor != null && !cursor.isClosed()){
            cursor.close();
        }   
        // return count

        return cursor.getCount();
    }
_

データベース内のレコードの総数を取得しようとしていますが、データベースは毎回Java.lang.IllegalStateException: attempt to re-open an already-closed object: Android.database.sqlite.SQLiteQuery (mSql = SELECT * FROM login)でクラッシュします。エラーで私を助けてください

_  03-05 22:23:14.208: E/AndroidRuntime(4988): FATAL EXCEPTION: main
    03-05 22:23:14.208: E/AndroidRuntime(4988): Java.lang.IllegalStateException: attempt to re-open an already-closed object: Android.database.sqlite.SQLiteQuery (mSql = SELECT  * FROM login) 
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at Android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.Java:34)
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at Android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.Java:64)
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at Android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.Java:283)
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at Android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.Java:264)
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at com.ecomm.Android.sqlite.DatabaseHandler.getRecordsCount(DatabaseHandler.Java:123)
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at com.ecomm.Android.LaunchActivity.DataBaseImplementation(LaunchActivity.Java:120)
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at com.ecomm.Android.LaunchActivity.onClick(LaunchActivity.Java:98)
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at Android.view.View.performClick(View.Java:2408)
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at Android.view.View$PerformClick.run(View.Java:8816)
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at Android.os.Handler.handleCallback(Handler.Java:587)
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at Android.os.Handler.dispatchMessage(Handler.Java:92)
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at Android.os.Looper.loop(Looper.Java:123)
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at Android.app.ActivityThread.main(ActivityThread.Java:4627)
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at Java.lang.reflect.Method.invokeNative(Native Method)
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at Java.lang.reflect.Method.invoke(Method.Java:521)
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:876)
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:634)
    03-05 22:23:14.208: E/AndroidRuntime(4988):     at dalvik.system.NativeStart.main(Native Method)
    03-05 22:23:15.608: I/binder_sample(4988): [Android.app.IActivityManager,2,1395,com.ecomm.Android,100]
    03-05 22:23:15.608: I/binder_sample(4988): Unknown binary event type 110
    03-05 22:23:15.608: I/binder_sample(4988): Binary log entry conversion failed
_
18
onkar

カーソルを閉じる前に、getCount()を呼び出す必要があります。

移動:

if(cursor != null && !cursor.isClosed()){
    cursor.close();
} 

未満:

 cursor.getCount();

このような:

public int getRecordsCount() {
    int count = 0;
    String countQuery = "SELECT  * FROM " + TABLE_LOGIN;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(countQuery, null);



    if(cursor != null && !cursor.isClosed()){
        count = cursor.getCount();
        cursor.close();
    }   
    return count;
}
27
Michał Z.

Java.lang.IllegalStateException:既に閉じられているものを再度開く

既に閉じているCursorcursor.getCount()を呼び出すため、エラーがスローされますが、これは許可されていません。

したがって、try-finally blockを使用して、最後にCursorを閉じるか、cursor.getCount()をint値に割り当ててすぐにCursorを閉じます。

しかし、最初のアプローチを使用することをお勧めします:

public int getRecordsCount() {
   String countQuery = "SELECT * FROM " + TABLE_LOGIN;
   SQLiteDatabase db = this.getReadableDatabase();
   Cursor cursor = db.rawQuery(countQuery, null);
   int count = 0;
   try {
      if (cursor.moveToFirst())) {
         count = cursor.getCount();
      }
      return count;
   }
   finally {
      if (cursor != null) {
         cursor.close();
      }
   }
}
5
Simon Dorociak

cursor.close()ステートメントを削除します

2
Bond James

私はこれが古いことを知っていますが、私の問題はonCreate()で、db.close()を実行した後にdb.execSQL(TABLE_CREATE)を呼び出していたことになりました。

onCreateは、dbHelper.getReadableDatabase()の後に自動的に呼び出されます。

これにより、既に閉じられたオブジェクトを使用してデータベースからすべての値を取得しようとしたため、クラッシュしました。 onCreateからdb.close()を削除すると、すべて機能しました。

0
craned