22
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
4

5 に答える 5

29

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;
}
于 2013-03-11T12:20:06.807 に答える
5

java.lang.IllegalStateException: すでに閉じたものを再度開こうとしています

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

したがって、try-finallyブロックを使用して、finally ブロックで閉じるか、 int 値にCursor割り当ててすぐに閉じます。cursor.getCount()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();
      }
   }
}
于 2013-03-11T12:26:01.227 に答える
2

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

于 2016-07-13T17:29:13.343 に答える
1

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

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

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

于 2015-05-27T12:34:50.597 に答える