Publiqué this en mayo en el grupo de Google [android-developers]. Nunca recibí respuesta y no pude reproducir el problema hasta que uno de mis alumnos lo hizo la semana pasada. Pensé que lo publicaría aquí y vería si hacía sonar las campanas para cualquiera.Excepción: intento de adquirir una referencia en un cierre SQLiteClosable
En uno de mis ejemplos de código, tengo el siguiente método:
static Cursor getAll(SQLiteDatabase db, String orderBy) {
return(db.rawQuery("SELECT * FROM restaurants "+orderBy, null));
}
Cuando lo ejecuto, esporádicamente, me sale esto:
05-01 14:45:05.849: ERROR/AndroidRuntime(1145):
java.lang.IllegalStateException: attempt to acquire a reference on a
close SQLiteClosable
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:31)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:56)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1118)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1092)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
apt.tutorial.Restaurant.getAll(Restaurant.java:14)
Esto no tiene sentido para mí. La base de datos está definitivamente abierta. El SQLiteClosable
es el SQLiteQuery
creado por SQLiteQueryDriver
, y yo ver ninguna evidencia de que hay una agrupación de objetos o algo pasando aquí que podría explicar cómo un "nuevo" SQLiteClosable
está ya cerrado. El hecho de que es esporádico (lo que significa que las mismas operaciones de interfaz de usuario a veces activan la excepción, pero no siempre) sugiere algún tipo de agrupación, condición de carrera , o algo así ... pero no estoy seguro de dónde.
¿Pensamientos?
Gracias!
ACTUALIZACIÓN: El código en cuestión es de los tutoriales LunchList de mi libro Android Programming Tutorials. Está un poco extendido y no es muy adecuado para publicar directamente en SO. Puede descargar el código de ese libro desde el enlace de arriba si quiere echarle un vistazo. No recuerdo exactamente en qué edición del tutorial estaba trabajando el alumno en ese momento, aunque estaba en el rango Tutorial 12-Tutorial 16. Tenía muchas esperanzas de encontrar a alguien que había tropezado con este problema antes y que probablemente era el culpable. Estoy bastante seguro de que mi base de datos está abierta. ¡Gracias de nuevo!
¿Hiciste algún progreso en esto? –
Ver la actualización que acabo de agregar a la consulta original. Es una ocurrencia tan rara que no estoy terriblemente preocupado; Solo esperaba que alguien que tenía el problema antes pudiera ver la pregunta. ¡Gracias! – CommonsWare
Sí, sucede muy raramente para mí también. De todos modos, esperaba encontrar al menos un informe de error, pero no lo hice. –