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.
- ¿Hay una buena razón para que un encabezado ListView ocupe una posición?
- Invocación de método puede producir java NullpointerException
- Consulta getContentResolver causa la advertencia CursorWrapperInner
- Obtener problemas de rendimiento de contactos
- SimpleCursorAdapter, Cambiando el cursor en el nivel de API por debajo de 11
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) .... ....
- cómo obtener la columna de conteo
- Ordenar una lista en orden ascendente por fecha desde sqlite
- Escribir dentro de un cursor Android
- Android Cursor.registerContentObserver ()
- Obtener palabra de EditText en la posición actual del cursor
- Cursor de Android en idiomas RTL
- Límite de tamaño del cursor en Android SQLiteDatabase
- Cómo eliminar el número de teléfono de contacto en android?
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
- El evento touchend no funciona en Android
- Res \ layout \ Contact_us.xml: Nombre de archivo no válido: debe contener sólo