¿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
- Anónimo Subir objeto de archivo a la API Imgur (JSON) da error de autenticación 401
- Java.util.zip.ZipException: entrada duplicada: cómo superar
- Llamada Hilo principal de hilo secundario en Java / Android
- admob no funciona debido a (creo) servicios de Google Play
- Convertir la hora de la época en la fecha y la hora de la fecha en la época en Android
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
- Vida útil de los objetos en Java vs .Net
- No es posible establecer dinámicamente el parámetro setVisibility ()
- Transferencia suave de WiFi en Android
- Cómo y qué establecer en Android WifiConfiguration.preSharedKey para conectarse a la red WPA2 PSK WiFi
- Inyección de múltiples componentes independientes
- Obtener la suma de comprobación de los códigos fuente en la biblioteca de Android
- Actividad que se crea dos veces en android
- LibGDX 0.9.9 - Aplicar cubemap en el entorno
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