Cursor already closed

¿Te sale este error cuando intentas cambiar el cursor de tu adapter?

java.lang.RuntimeException: Unable to resume activity …
java.lang.IllegalStateException: trying to requery an already closed cursor android.database.sqlite.SQLiteCursor

Parece que la gestion de los cursores de SimpleCursorAdapter ha cambiado en las versiones SDK > 11.

Si usas un adapter SimpleCursorAdapter para provisionar tu ListView, y has delegado la gestión del cursor al Activity haciendo startManagingCursor es posible que si cambias el cursor del adapter con changeCursor, te de un error de cursor actualmente cerrado…

Algo así como:

//Inicializamos el adapter en el constructor usando un cusor nulo
SimpleCursorAdapter mCursor = SimpleCursorAdapter(Context, int, Cursor, String[], int[])

[...]
//Presentamos los datos consultando la BBDD
Cursor productosCursor = mListaCompraDao.fetchAllProductosSeleccionados(listActive)
startManagingCursor(productosCursor);
mCursor.changeCursor(productosCursor);

Pues este código, que funciona perfectamente en versiones de SDK < 11 da un error cuando se retoma el activity, por ejemplo lanzando un subactivity y volviendo luego a este.

Para que funcionen en veresiones superiores, hay que quitarle la gestion del cursor antiguo al activity antes de cambiarlo al nuevo.

Algo así como:

if(mCursor.getCursor() != null){
stopManagingCursor(mCursor.getCursor());
mCursor.getCursor().close();
}
//Y ya podemos asignarle el nuevo cursor
startManagingCursor(productosCursor);
mCursor.changeCursor(productosCursor);

¿Te ha gustado? Compártelo!! 😀