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
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;
}
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();
}
}
}
supprimer l'instruction cursor.close()
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é.