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

  • Guardar Logcat en un archivo de texto en el dispositivo Android
  • Hashtable es apropiado para almacenar activos?
  • Métodos genéricos estáticos en .Net vs Java
  • Android - reproducir sonido diferente en cada segundo clic
  • AssembleDebug error en Android Studio
  • Disposición de Android con ListView y botones
  • Sincronizar la hora del sistema en 2 teléfonos
  • Android Thread.start () CalledFromWrongThreadException
  • Uso de android.jar en el proyecto Java - RuntimeException Stub?
  • Cómo encubrir el tiempo que tarda la respuesta a venir desde el servidor en android sin mostrar la pantalla en negro?
  • ¿Cómo obtengo la altura de la pantalla en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.