Intenta reabrir un objeto ya cerrado: sqlitequery

Así que esencialmente estoy consultando el DB dos veces. No entiendo de dónde viene realmente este error porque no estoy cerrando el DB en ninguna parte. El código que devuelve el error se ejecuta de esta manera. He revisado y acabo de ver un caso como el mío.

BeaconHandler pullAllDB = new BeaconHandler(this); try { List<Beacon> beaconsShown = pullAllDB.getAllBeacons(); for (final Beacon bn : beaconsShown) { try { int messageCount = pullAllDB.getMessageCount(); Log.d("Message", messageCount + " Messages Found"); if (messageCount > 0) { //Do Something } else { // Do Nothing } } catch (Exception e) { e.getStackTrace(); Log.e("Message", e.getMessage()); } } } 

Y el código que hace las consultas …

 public int getBeaconsCount() { String countQuery = "SELECT * FROM " + TABLE_BASIC_BEACON; SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(countQuery, null); cursor.close(); // return count return cursor.getCount(); } public int getMessageCount() { String mcountQuery = "SELECT * FROM " + MESSAGE_BEACON; SQLiteDatabase mdb = this.getReadableDatabase(); Cursor mcursor = mdb.rawQuery(mcountQuery, null); mcursor.close(); // return count return mcursor.getCount(); } 

2 Solutions collect form web for “Intenta reabrir un objeto ya cerrado: sqlitequery”

Usted debe publicar un logcat si está recibiendo un error. Ayuda a ver qué línea está causando su problema.

Desde los documentos Android.

cerca()

Cierra el Cursor, liberando todos sus recursos y haciéndolo completamente inválido.

Su llamada a mcursor.getCount() después de haberlo cerrado es probable que cause el error

Quizás intente algo como esto.

 int count = mcursor.getCount(); mcursor.close(); // return count return count ; 

Estoy asumiendo aquí que pullAllDB es su objeto de base de datos que contiene el código que hace las consultas. En ese caso, antes de la línea, List<Beacon> beaconsShown = pullAllDB.getAllBeacons(); , Deberías hacer algo como pullAllDB.open(); Y hacer pullAllDB.close(); Después de terminar de ejecutar las consultas.

Así que en general, su función se vería como ..

 try { //open the database class here pullAllDB.open(); List<Beacon> beaconsShown = pullAllDB.getAllBeacons(); for (final Beacon bn : beaconsShown) { try { int messageCount = pullAllDB.getMessageCount(); Log.d("Message", messageCount + " Messages Found"); if (messageCount > 0) { //Do Something } else { // Do Nothing } } catch (Exception e) { e.getStackTrace(); Log.e("Message", e.getMessage()); } //close the database here pullAllDB.close(); } } 
  • SQLiteOpenHelper "onCreate" no se llama? (El DB no existe)
  • SQLiteOpenHelper - crear base de datos en tarjeta SD
  • Intentando probar SQLiteOpenHelper pero getWritableDatabase () lanza Null
  • Confundido sobre CursorLoaders y usarlos con un SQLiteOpenHelper personalizado
  • No se puede bajar la base de datos de la versión `n` a` n-1` en Samsung
  • Cómo insertar a granel en sqlite en android
  • ¿Por qué no puedo usar Resources.getSystem () sin un error de tiempo de ejecución?
  • Java - java.lang.IllegalStateException: No se pudo leer la fila 0, col -1 de CursorWindow
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.