También tengo múltiples actividades y cada actividad abre su propia conexión de base de datos. Mantengo activa la Actividad principal mientras comienzo otras actividades, y llamo a finish() sobre las actividades del niño cuando ya no las necesito.
Lo que estoy viendo es que una actividad hija puede abrir con éxito una conexión y datos de consulta mientras la actividad principal aún se mantiene en su DBAdapter. Cuando la Actividad secundaria finaliza, la Actividad principal vuelve a consultar los cursores que están abiertos. Esto parece suceder automáticamente.
Sin embargo, después de hacer clic en torno a la interfaz de usuario por un tiempo, lo que hace que mi aplicación para iniciar y terminar las actividades, que finalmente obtendrá la excepción:
ERROR/Database(17657): Leak found
ERROR/Database(17657): java.lang.IllegalStateException:
/data/data/yourpackage/databases/yourdatabase
SQLiteDatabase created and never closed
ERROR/Database(17657): at android.database.sqlite.SQLiteDatabase.<init>
(SQLiteDatabase.java:1694)
La excepción no procede de la actividad que se actualmente en primer plano, pero de uno que fue terminado hace un tiempo. Entonces, lo que ocurre es que el recolector de basura está limpiando y buscando la conexión abierta de la base de datos. Esto no afecta a la aplicación, continúa funcionando bien y todas las consultas de la información de retorno de la actividad en primer plano.
La solución es simplemente cerrar la conexión en la actividad secundaria. El evento OnDestroy() es el lugar adecuado para hacer eso:
@Override
protected void onDestroy() {
super.onDestroy();
myAdapter.close();
}
Desde Pongo esto en todas mis actividades infantiles, ya no recibo la excepción.
Puede cerrar el archivo db después de escribirlo ... – svens
Pensé en eso también, pero una actividad es una actividad de lista que se rellena con un adaptador de cursor. Pensé que al cerrar la base de datos, fallaría la consulta del adaptador. –
@John: si usa la base de datos singleton, ¿dónde la abre y cierra? – Emerald214