2010-07-13 13 views
9

Tengo una aplicación para Android que usa una base de datos SQLite. Abrí la base de datos cuando se inicia la aplicación, pero nunca la cierro porque está en uso constante.Flushing y base de datos SQLite en android

¿Cuál es la mejor manera de decirle a la base de datos que elimine todos sus cambios de almacenamiento permanente? ¿Debo cerrarlo y volver a abrir o hay una manera más eficiente?

Mi problema es que al probar en un teléfono, apagar el teléfono después de varias grabaciones a veces hace que la base de datos pierda las actualizaciones más recientes cuando se reinicia, lo cual es obviamente inaceptable para un sistema de base de datos.

Como no puedo encontrar la manera de capturar el evento de cerrar la aplicación, no sé cuándo cerrar manualmente la base de datos.

Respuesta

8

Abra la base de datos cuando se inicia la aplicación, pero nunca la cierre ya que está en uso constante.

No hagas eso. Al parecer, ignora todos los errores que aparecen en LogCat quejándose de que está perdiendo conexiones con la base de datos.

¿Cuál es la mejor manera de decirle a la base de datos para eliminar todos sus cambios a almacenamiento permanente?

It will do that automatically at the end of a transaction. De forma predeterminada, cada operación SQL individual (por ejemplo, insertar) es una transacción.

¿Debo cerrarlo y volver a abrir o hay una manera más eficiente?

Debe cerrar su base de datos en algún momento (por ejemplo, onDestroy() del servicio que está mediando su base de datos).

Mi problema es que cuando se prueba en un teléfono , apagar el teléfono después de un número de escrituras a veces hace que la base de datos desatar las más recientes actualizaciones cuando la aplicación se reinicia, lo que obviamente es inaceptable para un sistema de base de datos.

Si usted puede crear un proyecto de ejemplo que muestra el problema, incluso después de que se cierre correctamente la conexión a la base de datos, que lo ponga a la Android issue tracker.

Ya que no puedo encontrar la manera de capturar el cierre de sucesos de aplicación no puedo saber cuándo hay que cerrar manualmente la base de datos .

cerrarla cuando todas las actividades tienen unido de servicio que está mediando la conexión de base de datos, lo que provocó que el método de servicio onDestroy().

O bien, abra una conexión nueva en cada componente que necesite acceso a la base de datos, y utilice la sincronización Java para asegurarse de que dos subprocesos no intenten usar la base de datos simultáneamente (si es necesario).

+3

Una aplicación no tiene que usar el servicio de mediación para usar una base de datos SQLite, y una aplicación de Android no se notifica cuando se apaga, por lo que la respuesta anterior no es muy útil. –

-1

¿Eso es en un Droid? ¿Y cómo exactamente apagas el teléfono? A menos que saque la batería, apagar el teléfono lentamente reducirá el funcionamiento del sistema operativo, momento en el cual lo memorizará todo.

¿Cuándo exactamente pierde su base de datos? Después de cada reinicio de la aplicación, ¿o simplemente al azar? Si es después de cada reinicio, parece que estás destruyendo la base de datos al inicio.

+0

Después de un reinicio, habrá perdido información de forma incoherente. Cuando inicio el dispositivo simplemente abro y luego consulto el contenido de la base de datos, y algunas veces solo parte de la información está allí. ¿Por qué el dispositivo comprometería todo en el disco? Si el SO mata el programa sin llamar aTerminate (que el SDK dice que es perfectamente válido y se espera que haga), ¿necesito cerrar/volver a abrir la base de datos después de cada escritura? – Akusete

+1

A menos que mates una aplicación (ya sea con un sigtermo o quitando la batería), siempre se apagará limpiamente. Mire el código fuente de todas las aplicaciones de Android, como la aplicación de mensajería: todas usan un proveedor de contenido que abre una base de datos pero nunca la cierra. Dejan que el sistema operativo finalice el proceso, y en ese momento se limpiará. (Hackbod lo mencionó en una publicación en algún lugar). No debería haber ninguna razón para enjuagar nada. ¿Puedes publicar un código sobre cómo crear/administrar tu base de datos? – EboMike

1

Si usa alguna transacción, están anidados. Es decir, si saltas de una antes de terminarla. Terminará con algunas escrituras retrocedidas cuando se reinicia el teléfono o la aplicación, ya que nunca cierra la conexión.

db.beginTransaction(); 
    try { 
    ... 
    db.setTransactionSuccessful(); 
    } finally { 
    db.endTransaction(); 
    } 
Cuestiones relacionadas