android - puntero - no aparece el cursor en mi laptop lenovo
Finalizando un Cursor que no ha sido desactivado o cerrado error no fatal (9)
Cierre el objeto del cursor donde sea que lo esté creando.
Cuando crea un objeto de cursor y lo hace al atravesar una tabla SQLite, ciérrelo después de haberlo utilizado. Este cierre de cursor evita la excepción en logcat.
No obtendrá ninguna excepción relacionada con la finalización del cursor que se dejó abierto.
Esto solucionó el mismo problema en mi aplicación.
Obtengo un error de "Finalización de un Cursor que no se ha desactivado o cerrado" en este fragmento de código. El código se usa para completar una vista de lista.
Dado que es un error no fatal, no se produce un bloqueo y todo parece funcionar bien ... pero no me gusta el error.
Si cierro el cursor al final de este código ... la lista de la vista está vacía. si cierro el cursor en onStop, obtengo 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)
....
....
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á ya que el cursor no está en ninguna posición.
En mis adaptadores base hago un cursorMoveToPosition en las getViews. Esto parece eliminar la necesidad del movimiento primero.
Luché con este problema durante dos días. Estaba intentando que funcione el código de muestra, que pasó un cursor, devuelto de una consulta a la base de datos, directamente al adaptador de lista, sin adaptador provisional. Se negó a funcionar, solo mostró una pantalla en blanco, hasta que invoqué ''moveToFirst ()'' en el cursor antes de pasarlo a ListAdapter. ¡Imagínate! Cuando comento esto, se rompe.
Solo pensé en compartir esto para salvar a las personas con las mismas dificultades que tuve.
Si alguien puede arrojar algo de luz sobre por qué esto es así, lo agradecería. Hasta ahora no he tenido que invocar moveToFirst en los cursores para que funcionen correctamente.
No debería recibir ese mensaje si cierra el Cursor
en onStop()
o onDestroy()
. Por favor inténtalo de nuevo. O bien, llame a startManagingCursor()
después de obtener el Cursor
de su consulta, y Android cerrará el Cursor
por sí mismo.
No use startManagingCursor () ya que ya no es el enfoque recomendado. El problema ocurre porque una conexión cursor / DB aún no está cerrada para cuando el finalizador llega a este objeto. Puede evitar eso ya sea permitiendo que un cargador administre el cursor o rastreando todas las conexiones cursor / DB / SQLiteOpenHelper usted mismo y limpiando después de ellas.
El uso de un cargador es bastante engorroso y requiere muchas piezas móviles para que funcione junto con, por ejemplo, una vista de lista. Por otro lado, el seguimiento del cursor y las conexiones de la base de datos es propenso a errores humanos. Si la cantidad de objetos cursor / DB es baja, recomendaría la última solución. Si no, deja que un cargador maneje tus conexiones.
Scott,
Me encontré con el mismo problema que tú. Antes de cerrar su 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();
}
Usted mencionó que si cerró el cursor, su vista de lista permanece vacía. Le recomiendo que pase la información a una clase y la copie (asigne la memoria) y luego cierre el cursor.
Solo tuve el mismo problema y pensé en avisarle, por si acaso ...
Accidentalmente llamé a mi rutina de búsqueda 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 ha quedado obsoleto.
El nuevo reemplazo de cursorLoader para startManagingCursor parece ser excesivo.
Mover la posición del cursor como se sugirió no funcionó.
Convertir la tarea en 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 que la tarea sea 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 auxiliar 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 solucionado mi problema