¿No cierra el cursor o el objeto de la base de datos?
Consigo este error después de ir a esta actividad, comenzando una nueva, volviendo. No sucede cuando carga la actividad por primera vez. Funciona funcionalmente todo … pero todavía consigo este error.
ERROR / Cursor (1059): Finalizar un Cursor que no ha sido desactivado o cerrado. Base de datos = /data/data/com.roger.testapp/databases/data, table = null, query = SELECT MAX (_id) FROM registro
- Ejemplo sencillo de Android Scroller
- ¿Es compatible con AndroidHttpClient?
- AES128 Descifrado: javax.crypto.badpaddingexception pad block dañado
- ¿Por qué no funciona mi servicio en Android? (Sólo quiero registrar algo nunca 5 segundos)
- ¿Cómo puedo hacer que mi Android SwipeableCardViews se parezca más a la aplicación de correo de IOS 7 (desliza para mostrar los botones)
03-02 16: 47: 21.835: ERROR / Cursor (1059): android.database.sqlite.DatabaseObjectNotClosedException: La aplicación no cerró el cursor o el objeto de base de datos que se abrió aquí
En onCreate:
mDbHelper = new CommonDbAdapter(this); mDbHelper.open(); fillData();
FillData () llama a fetchNote en mi dbhelper, el cursor se utiliza para un par de cosas, si rowId == 0, eso significa que no seleccioné un elemento para entrar en esta actividad y quiero obtener la última fila en esa tabla. If rowId = algo más, entonces tomo esa fila. Creo que el problema está aquí en alguna parte, no estoy seguro.
public Cursor fetchNote(long rowId, String table, String columns) throws SQLException { if (rowId == 0) { String query = "SELECT MAX(_id) FROM record"; Cursor cursor = mDb.rawQuery(query, null); rowId = 0; if (cursor.moveToFirst()) { rowId = cursor.getInt(0); } } Cursor mCursor = mDb.query(true, table, new String[] {KEY_ROWID, columns}, KEY_ROWID + "=" + rowId, null, null, null, null, null); if (mCursor != null) { mCursor.moveToFirst(); } return mCursor; }
En onDestroy:
super.onDestroy(); if (mDbHelper != null) { mDbHelper.close(); }
También, soy startManagingCursor
- Crea una biblioteca nativa de Android con Adobe Air
- Clave de Google Maps en AndroidManifest.xml de google-services.json
- E / art: Error al enviar la respuesta al depurador: Canal roto, pero la aplicación todavía se ejecuta
- Elementos de menú de la bandeja de navegación seleccionados dentro de diferentes grupos
- Gradle: descargue dependencias, bloquee versiones y actualice dependencias manualmente
- ¿Cómo puedo devolver datos en el método de Retrofit onResponse?
- ¿Hay alguna biblioteca o algoritmo para el calendario persa (Shamsi o Jalali) en Android?
- Cómo navegar desde una pantalla a otra pantalla
No cierre su base de datos en onDestroy
. Cierre inmediatamente después de haber terminado de usarlo (asegúrese de que cada cursor esté cerrado antes de cerrar la base de datos). OnDestroy no se puede llamar cuando se espera.
Además, cierre su objeto Cursor
vez que haya terminado de usarlo.
Ediciones: Dado que su actividad es la gestión de su Cursor
, puede considerar dejar de administrarlo y cerrar todo en el método onPause
, y en onResume
abrir todo y fillData
una vez más. Si pudiera cambiar su código para que no confíe en su actividad de administración del cursor, no necesitaría mantener objetos de base de datos abiertos y preocuparse por ellos.
Yo recomendaría no devolver un cursor. Es un recurso escaso.
En Java EE de n niveles, la mejor práctica es cerrar todos los recursos de persistencia (Connection, Statement y ResultSet) en el ámbito del método en el que se crearon. Asigne un ResultSet a un objeto o colección y cierre el ResultSet.
No sé si hay algo especial sobre Android que invalida esto.
Echa un vistazo al ciclo de vida de la actividad : puedes ver que cuando onPause
lejos de tu actividad ( onPause
) si otra actividad necesita memoria, el proceso se onPause
, pero cuando tu usuario vuelve a la actividad, volverá a onCreate
. Esta vez está abriendo un NUEVO CommonDbAdapter (pero nunca cerró el original) – por lo tanto, cuando finalmente golpeó onDestroy
sólo cerraría el mDbHelper más reciente.
Como se ha dicho por otros, su mejor método es no pasar el cursor de regreso desde el DBHelper, crear un objeto con sus datos, cerrar el cursor y pasar su objeto de nuevo. También cierra el DBHelper una vez que lo has utilizado, siempre puedes crear otro si necesitas volver a usarlo.
- No se puede resolver la actividad para: Intención cuando se realizan pruebas de instrumentación en las actividades de Android
- Android – view.Surface OutOfResourcesException