¿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

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

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.

  • Loopj Android Async Http - onFailure no disparado
  • API de calendario de Android vs API de proveedor de calendario
  • Cómo crear una gota de mapa de bits en la actividad de Android?
  • Final int parámetro utilizado en Runnable anónimo
  • Cómo mostrar el lunes como primer día CalendarView
  • Android 4.4.2 Protocolo SSL abortado
  • Devolución de una secuencia de entrada del descriptor de archivo de parcela mediante Androids DownloadManager
  • Seguridad y autenticación cliente-servidor
  • Es una pérdida de una sola vez de referencia a la memoria nativa asignada por una aplicación Android un gran negocio?
  • El carácter Unicode ("\ u232B") no se muestra en el botón
  • ¿Cuál es el equivalente de Java de la Palabra clave Estática de VB.NET?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.