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 sqlite cómo comprobar si existe un registro
- Cifrado sqlite para android
- Actualizar tabla Sqlite si campo de cadena comienza con signo más (+)?
- SQLite externo Contenido del archivo que accede al error
- ¿Qué tipos de caché realiza SQLite en Android?
- ¿Cuáles son las extensiones .db-shm y .db-wal en las bases de datos Sqlite?
- Administración de conexiones SQLite en Android
- Entender el campo de incremento automático de Android de sqlite
- sqlite Android - cómo obtener el valor de col / fila específica
- Uso de archivo personalizado para la base de datos Android sqlite
- ¿Es la operación costosa de SQLite cursor.getCount en Android
- ¿Puede el androide sqlite interfaz ser utilizado fuera de Android
- Encriptación de contraseña de Android SQlite?
¿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ó.