android - tutorial - sqlite opendatabase
Compartir la base de datos sqlite entre múltiples actividades de Android (3)
¿Pueden dos o más actividades de Android abrir una base de datos sqlite3 para escribir?
Tengo dos actividades que necesitan insertar datos en la misma base de datos sqlite. Cuando la segunda actividad llama a SQLiteOpenHelper.getWriteableDatabase()
genera una excepción IllegalStateException con el mensaje " SQLiteDatabase creada y nunca cerrada ".
He podido evitar la excepción al hacer que mi objeto de base de datos sea un singleton, pero creo que debe haber una mejor manera.
Gracias,
Juan
Lo que haría es definir la base de datos en una superclase que es AppCompatActivity si todas las actividades amplían esta clase, o definirla en la clase de actividad que se hereda de todas las actividades.
Realmente nunca hay más de una actividad ejecutándose a la vez. La forma más fácil de solucionar esto sería tener la primera actividad cerca de su conexión antes de comenzar la segunda actividad. Puede hacer esto en el onPause () y luego volver a abrirlo en el onResume (). Algo así (muy psuedo-code):
MyActivity {
OnResume()
open connection to database
OnPause()
close connection to database
}
De esta manera, nunca intentará tener más de una conexión a la vez y la conexión siempre estará disponible.
También tengo múltiples actividades y cada actividad abre su propia conexión de base de datos. Mantengo viva la actividad principal mientras comienzo otras actividades, y llamo a terminar () en las actividades para niños cuando ya no las necesito.
Lo que estoy viendo es que una Actividad infantil puede abrir una conexión y consultar datos con éxito, mientras que la Actividad principal aún mantiene su DBAdapter. Cuando la actividad del niño finaliza, la actividad principal requiere todos los cursores que están abiertos. Esto parece suceder automáticamente.
Sin embargo, después de hacer clic en la interfaz de usuario durante un tiempo, lo que hace que mi aplicación inicie y finalice Actividades, 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 es de la Actividad que está actualmente en primer plano, sino de una que se terminó hace un tiempo. Entonces, lo que sucede es que el recolector de basura está limpiando y encontrando la conexión de base de datos abierta. Esto no afecta a la aplicación; sigue funcionando bien y todas las consultas de los datos de retorno de la actividad en primer plano.
La solución es simplemente cerrar la conexión en la actividad del niño. El evento onDestroy () es el lugar correcto para hacerlo:
@Override
protected void onDestroy() {
super.onDestroy();
myAdapter.close();
}
Desde que puse esto en todas mis actividades para niños, ya no recibo la excepción.