Finalizando un Cursor que no ha sido desactivado o cerrado error no fatal

Estoy recibiendo un error "Finalizando un cursor que no se ha desactivado o cerrado" en este código. El código se utiliza para rellenar una vista de lista.

Dado que es un error no fatal, no hay ningún bloqueo y todo parece funcionar bien .. pero no me gusta el error.

Si cierro el cursor al final de este código … la lista quedará vacía. Si cierra el cursor en onStop, consigo el mismo error.

¿¿Cómo puedo solucionar esto??

private void updateList() { DBAdapter db = new DBAdapter(this); db.open(); //load all waiting alarm mCursor=db.getTitles("state<2"); setListAdapter(new MyCursorAdapter(this, mCursor)); registerForContextMenu(getListView()); db.close(); } error : E/Cursor ( 2318): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/xxxxxxxxxxxxxxx.db, table = alerts, query = SELECT _id, alert_id, E/Cursor ( 2318): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here E/Cursor ( 2318): at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210) E/Cursor ( 2318): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java: 53) E/Cursor ( 2318): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java: 1345) E/Cursor ( 2318): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java: 1229) .... .... 

No debería recibir ese mensaje si cierra el Cursor en onStop() o onDestroy() . Por favor, inténtelo de nuevo. O bien, llama a startManagingCursor() después de obtener el Cursor de tu consulta y Android cerrará el Cursor por sí solo.

Scott,

Me encontré con el mismo problema que tú. Antes de cerrar la base de datos, es decir, "db.close ()", asegúrese de que sus cursores estén cerrados primero, es decir, "mCursor.close ()"

Al igual que:

 private void updateList() { DBAdapter db = new DBAdapter(this); db.open(); //load all waiting alarm mCursor=db.getTitles("state<2"); setListAdapter(new MyCursorAdapter(this, mCursor)); registerForContextMenu(getListView()); // Let's close the cursor. mCursor.close(); db.close(); } 

Mencionaste que si has cerrado el cursor, la vista de la lista permanece vacía. Le recomiendo pasar la información a una clase y copiarla (asignar la memoria) y luego cerrar el cursor.

Cuando una consulta devuelve un cursor, en realidad se coloca "antes" del primer registro en el cursor. Un adaptador intentará hacer un 'getItem' en el primer elemento por lo que fallará como el cursor no está posicionado en ninguna.

En mis adaptadores base hago un cursorMoveToPosition en el getViews. Esto parece eliminar la necesidad del movimiento primero.

No utilice startManagingCursor () ya que ya no es el método recomendado. El problema se produce porque una conexión cursor / DB todavía no está cerrada por el tiempo que el finalizador obtiene a este objeto. Puede evitar que al permitir que un cargador para gestionar el cursor o mediante el seguimiento de todas las conexiones cursor / DB / SQLiteOpenHelper usted mismo y la limpieza después de ellos.

El uso de un cargador es bastante engorroso y requiere una gran cantidad de partes móviles para que funcione en conjunto con decir una vista de lista. Por otro lado el seguimiento de sus conexiones de cursor y base de datos es propenso a errores humanos. Si el número de objetos cursor / DB es bajo, recomiendo la última solución. Si no, deje que un cargador maneje sus conexiones.

Cierre el objeto cursor donde quiera que lo esté creando.

Cuando se crea un objeto de cursor y se hace con recorrer a través de una tabla SQLite, córtela después de que se ha utilizado. Este cierre del cursor impide la excepción en logcat.

No obtendrá ninguna excepción relacionada con la finalización del cursor que se ha dejado abierto.

Esto solucionó el mismo problema en mi aplicación.

Luché con este problema durante dos días. Yo estaba tratando de obtener código de ejemplo de trabajo que pasó un cursor, devuelto desde una consulta de base de datos, directamente a la lista de adaptador – sin adaptador provisional. Se negó a trabajar – sólo se muestra una pantalla en blanco – hasta que he invocado 'moveToFirst ()' en el cursor antes de pasarlo a ListAdapter. ¡Imagínate! Cuando comento esto, se rompe.

Sólo pensé que compartiría esto para salvar a la gente las mismas luchas que tuve.

Si alguien puede arrojar alguna luz sobre por qué esto es así, lo agradecería. No he tenido que invocar a moveToFirst en cursores hasta ahora, para que funcionen correctamente.

Sólo tuvimos el mismo problema y pensamos en hacerte saber – por si acaso …

Llamé accidentalmente mi rutina de la recuperación dos veces y por este medio "perdí" el cursor resultante de la primera llamada. Esto causó el error.

Yo también he tenido problemas con el cierre del cursor:

  • Al cerrar el cursor justo después de configurar el adaptador de la vista de lista, el cursor se cierra antes de que se muestren los datos.

  • No se puede usar startManagingCursor para administrar el cursor porque se ha desaprobado.

  • La nueva sustitución cursorLoader para startManagingCursor parece ser excesiva.

  • Mover la posición del cursor como se sugirió no funcionó.

  • Hacer de la tarea una clase interna de la actividad y cerrar el cursor en el método onDestroy de la actividad funciona a veces pero no todo el tiempo.

  • Hacer de la tarea una clase interna de la actividad y cerrar el cursor en el método onStop de la actividad parece estar funcionando.

También descubrí que puedo cerrar la base de datos y el ayudante abierto sqlite antes de cerrar el cursor. Incluso puedo cerrarlos justo después de configurar el adaptador de la vista de lista. Los datos seguirán apareciendo.

StartManagingCursor (cursor);

Esto ha arreglado mi problema

  • POJO versus Cursores en Android
  • ¿Cuál es la mejor manera de iterar un Cursor Android?
  • Obtener cuenta con cursor.getCount () o para ejecutar un rawQuery con un COUNT en una cláusula SQL?
  • Android ¿cómo codificar ahora si requery está obsoleto?
  • StaleDataException: acceso al cursor cerrado
  • Notificar cambios de datos en un cursor sin utilizar un ContentProvider
  • Vincular los datos del cursor a un diseño no listado
  • Cómo mostrar las imágenes guardadas en la carpeta sdcard en android
  • Optimización del acceso a cursores en Android: Posición vs nombres de columna
  • ¿Cómo puedo hacer que mi Cursor sobreviva a un cambio de orientación?
  • Modificar el valor de las columnas Cursor en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.