2009-10-12 25 views
16

¿Pueden dos o más actividades de Android abrir una base de datos sqlite3 para escribir?Compartir bases de datos sqlite entre múltiples actividades de Android

Tengo dos actividades que necesitan insertar datos en la misma base de datos sqlite. Cuando la segunda actividad llama al SQLiteOpenHelper.getWriteableDatabase() se genera una IllegalStateException con el mensaje "SQLiteDatabase creada y nunca cerrada".

He podido evitar la Excepción haciendo que mi objeto de base de datos sea un singleton, pero estoy pensando que debe haber una manera mejor.

Gracias,

John

+0

Puede cerrar el archivo db después de escribirlo ... – svens

+0

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. –

+0

@John: si usa la base de datos singleton, ¿dónde la abre y cierra? – Emerald214

Respuesta

14

Nunca hay realmente más de una actividad ejecutándose al mismo tiempo. La manera más fácil de arreglar esto sería tener la primera actividad para cerrar su conexión antes de comenzar la segunda actividad. Puede hacer esto en OnPause() y luego volver a abrirlo en onResume(). Algo como esto (muy pseudo-código):

MyActivity { 
    OnResume() 
     open connection to database 
    OnPause() 
     close connection to database 
} 

De esta manera nunca está tratando de tener más de una conexión a la vez y la conexión está siempre disponible.

+3

Me he estado preguntando si este enfoque es mejor que hacer que las actividades usen el mismo objeto singleton.Creo que es porque este enfoque deja la conexión es el estado correcto al pausar una actividad. Tener una conexión singleton hace que la limpieza sea problemática. Gracias. –

+0

Sí ... si no lo está cerrando en Pausa, la conexión simplemente queda ahí colgando si (por ejemplo) recibe una llamada telefónica. –

+0

Esto no funciona. Obtengo una InvalidStateException y una consulta SQL que no se pudo ejecutar, incluso antes de invocar onResume(). Android parece estar consultando cursores antes de llamar a Reesume(). – cdonner

2

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.

0

Lo que haría sería definir la base de datos en una superclase que sea AppCompatActivity si todas las actividades extienden esta clase, o definirla en la clase Activity que se hereda para todas las actividades.

Cuestiones relacionadas