web-dev-qa-db-fra.com

java.lang.IllegalStateException: tentative de ré-ouverture d'un objet déjà fermé (fermeture testée)

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();
    }

J'essaie d'obtenir le nombre total d'enregistrements dans la base de données, mais la base de données se bloque à chaque fois avec Java.lang.IllegalStateException: attempt to re-open an already-closed object: Android.database.sqlite.SQLiteQuery (mSql = SELECT * FROM login). S'il vous plaît, aidez-moi avec l'erreur

  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

Vous devez appeler getCount() avant de fermer votre curseur.

Bouge toi:

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

au dessous de:

 cursor.getCount();

comme ça:

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: tentative de rouvrir un déjà fermé

Votre erreur est levée car vous appelez cursor.getCount() sur Cursor que vous fermez déjà et cela n'est pas autorisé.

Donc, essayez d'utiliser try-finally bloc où, dans le bloc final, vous fermez votre Cursor ou affectez cursor.getCount() à la valeur int et fermez Cursor immédiatement .

Mais je vous recommande d'utiliser la première approche:

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

supprimer l'instruction cursor.close()

2
Bond James

Je sais que c'est vieux, mais mon problème a fini par être que dans onCreate(), j'appelais db.close() après avoir exécuté db.execSQL(TABLE_CREATE).

onCreate est automatiquement appelé après dbHelper.getReadableDatabase().

Cela l'a fait planter car il est ensuite allé récupérer toutes les valeurs de la base de données avec un objet déjà fermé. Une fois que j'ai supprimé db.close() de onCreate, tout a fonctionné.

0
craned