2012-04-12 18 views
5

Descripción general: la apertura de conexiones de db en onStart y en tareas asíncronas ha llegado a ser bastante compleja. ¿Es una mala práctica tener conexiones db disponibles en todo el mundo? Si es malo, ¿cuál es la mejor manera?Android ¿cuándo debería abrir y cerrar conexiones de db?

Detalles: Tengo una aplicación que se conecta a la base de datos sqlite3 en varias actividades. Al principio no había muchos lugares donde necesitaba acceder a la base de datos, así que solo abría y cerraba cada vez que necesitaba acceso. Luego había más lugares que necesitaban acceder a él, así que, como se sugirió en otra pregunta sobre el desbordamiento de pila, comencé a abrir las conexiones de la base de datos en el método onStart de la actividad que necesitaba una conexión y la cerré en el método onStop.

Esto funcionó bien hasta que comencé a necesitar conexiones en algunas tareas asincrónicas que sobrevivieron a la actividad. Como el método onStop para la actividad se había llamado y las conexiones se habían cerrado, para cuando la tarea asincrónica intentó acceder a la base de datos estaba fallando. Como solución, creé conexiones separadas para cada tarea asíncrona que se abrieron en el método onPreExecute y cerré en el método onPostExecute.

Esto ha dado lugar a una gran cantidad de apertura y cierre de conexiones, y me pregunto si la creación de conexiones de db disponibles en todo el mundo en el contexto de la aplicación es una buena idea. Definitivamente limpiaría una gran cantidad de código y eliminaría cualquier excepción de db no cerrada que esté sucediendo si olvido cerrar una conexión o si la aplicación experimenta un cierre forzado. ¿Alguien más ha intentado esto/ve algún problema con este enfoque?

+0

Esta es una buena práctica, hazlo. El problema principal que debe evitarse es la pérdida de memoria al utilizar el contexto de la aplicación, lo que no debería ser un problema si solo es para las operaciones de la base de datos. – stealthcopter

Respuesta

2

Me encontré con problemas similares hace algunas semanas. Utilizo varias clases que tienen persistencia en un SQLite db.

Como quería desacoplar las actividades de la persistencia, creé clases internas estáticas (llamadas Administradores) para aquellas que necesitan persistencia. Cada vez que crea una instancia de un Administrador, se crea una conexión db y, después de usar el administrador, la cierro explícitamente. Si tuviera gerentes globales para acceder a las tablas, deberían estar sincronizados debido a la concurrencia y no sé cuándo debería cerrar esas conexiones de db. Así que lo hice de esta manera.

Espero que esto ayude!

+0

Gracias, no estaba pensando en el problema de concurrencia, esto es lo que estaba buscando. – odiggity

+0

¡De nada! ¡Encantado de ayudar! :) – Caumons

2

Puede crear una BaseAsyncTask cuyo onPreExecute() y onPostExecute() son responsables de abrir y cerrar las conexiones de db.

Las AsyncTasks pueden extender la llamada a BaseAsyncTask super.onPreExecute() y super.onPostExecute() y realizar la carga real de datos en el método doInBackground().

+0

Tuve que aceptar la otra respuesta, ya que respondió mejor a mi pregunta, pero definitivamente haré esto también. ¡Gracias! – odiggity

Cuestiones relacionadas