Java.lang.IllegalStateException: intento de volver a abrir un objeto ya cerrado (Tried closing)

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

Estoy tratando de obtener el número total de registros en la base de datos, pero la base de datos se está estrellando cada vez con java.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT * FROM login) . Por favor, ayúdame con el error

  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 

¿Has intentado moverte?

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

abajo:

  cursor.getCount(); 

Me gusta esto:

 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: intento de volver a abrir un ya cerrado

Su error se produce porque llama a cursor.getCount() en Cursor que ya está cerrado y esto no está permitido.

Por lo tanto, o intenta usar try-finally block donde finalmente bloquea tu Cursor o asigna cursor.getCount() al valor int y cierra inmediatamente el Cursor .

Pero te recomiendo que uses la primera aproximación:

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

Quite la cursor.close()

Sé que esto es viejo, pero mi problema terminó siendo que en onCreate() , estaba llamando a db.close() después de ejecutar db.execSQL(TABLE_CREATE) .

onCreate se llama automáticamente después de dbHelper.getReadableDatabase() .

Esto causó que se bloquee porque luego fue a recuperar todos los valores de la base de datos con un objeto ya cerrado. Una vez que db.close() de onCreate , todo funcionó.

  • Obtener información de la base de datos sqlite
  • Cómo incrustar una fuente personalizada en la aplicación de Android (WebView)
  • onDowngrade () en SQLiteOpenHelper (u otra forma de no bloquearse al degradar)
  • Problema con SQLite DB para Android
  • No se puede abrir el directorio de datos en el teléfono Android con raíz
  • ¿Puedo descargar un db de SQLite en / sdcard y acceder desde mi aplicación Android?
  • Cómo almacenar la base de datos SQLite de Android en sdcard
  • No puede ver datos Sqlite con adaptador simple
  • ¿En Android puedo hacer una consulta SQL en un cursor?
  • Android: Guardar imágenes en la base de datos Sqlite
  • Se abren varias bases de datos de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.