Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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 

  • Android.database.CursorWindowAllocationException al mover un Cursor
  • Acceso a la base de datos SQLite desde la línea de comandos
  • ¿Cómo puedo ordenar mi base de datos SQLITE en orden descendente, para una aplicación de Android?
  • Eliminar las primeras filas en la base de datos android sqlite
  • Cómo realizar operaciones de base de datos mediante Async Task
  • La mejor manera de trabajar con las fechas en Android SQLite
  • ¿Un cursor SQLite vacío devolverá true para isBeforeFirst, isAfterLast, ambos o ninguno?
  • Android cómo obtener datos sqlite por nombre de columna
  • 4 Solutions collect form web for “Java.lang.IllegalStateException: intento de volver a abrir un objeto ya cerrado (Tried closing)”

    ¿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ó.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.