Copia de seguridad / restauración de Android: ¿cómo hacer una copia de seguridad de una base de datos interna?

He implementado unaBackupAgentHelper utilizando el @ proporcionaFileBackupHelper para hacer una copia de seguridad y restaurar la base de datos nativa que tengo. Esta es la base de datos que normalmente usa junto conContentProviders y que reside en/data/data/yourpackage/databases/.

One pensaría que este es un caso común. Sin embargo, los documentos no tienen claro qué hacer:http: //developer.android.com/guide/topics/data/backup.htm. No hayBackupHelper específicamente para estas bases de datos típicas. Por eso utilicé laFileBackupHelper, apuntó a mi archivo .db en "/databases/ ", introdujo bloqueos alrededor de cualquier operación db (comodb.insert) en miContentProviders, e incluso intenté crear el "/databases/ "directorio antes deonRestore() porque no existe después de la instalación.

He implementado una solución similar paraSharedPreferences con éxito en una aplicación diferente en el pasado. Sin embargo, cuando pruebo mi nueva implementación en el emulador-2.2, veo que se realiza una copia de seguridad enLocalTransport de los registros, así como una restauración que se realiza (yonRestore() llamado). @ Sin embargo, el archivo db en sí mismo nunca se crea.

Tenga en cuenta que todo esto es después de una instalación y antes del primer inicio de la aplicación, después de que se haya realizado la restauración. Aparte de eso, mi estrategia de prueba se basó enhttp: //developer.android.com/guide/topics/data/backup.html#Testin.

Tenga en cuenta que no estoy hablando de alguna base de datos sqlite que administro yo mismo, ni de hacer una copia de seguridad en una tarjeta SD, un servidor propio o en otro lugar.

Vi una mención en los documentos sobre bases de datos que aconsejaban usar una @ personalizaBackupAgent pero no parece estar relacionado:

Sin embargo, es posible que desee extender BackupAgent directamente si necesita: * Hacer una copia de seguridad de los datos en una base de datos. Si tiene una base de datos SQLite que desea restaurar cuando el usuario reinstala su aplicación, debe crear un Agente de copia de seguridad personalizado que lea los datos apropiados durante una operación de copia de seguridad, luego cree su tabla e inserte los datos durante una operación de restauración. @

Alguna claridad por favor.

Si realmente necesito hacerlo yo mismo hasta el nivel SQL, entonces me preocupan los siguientes temas:

Abrir bases de datos y transacciones. No tengo idea de cómo cerrarlos desde una clase tan única fuera del flujo de trabajo de mi aplicación.

Cómo notificar al usuario que hay una copia de seguridad en curso y que la base de datos está bloqueada. Puede llevar mucho tiempo, por lo que es posible que deba mostrar una barra de progreso.

Cómo hacer lo mismo en la restauración. Según tengo entendido, la restauración puede ocurrir justo cuando el usuario ya ha comenzado a usar la aplicación (y a ingresar datos en la base de datos). Por lo tanto, no puede presumir que solo restaure los datos respaldados en su lugar (eliminando los datos vacíos o antiguos). Tendrá que unirse de alguna manera, lo que para cualquier base de datos no trivial es imposible debido a los id.

Cómo actualizar la aplicación después de que se realiza la restauración sin que el usuario se quede atascado en algún punto, ahora inalcanzable.

¿Puedo estar seguro de que la base de datos ya se ha actualizado en copia de seguridad o restauración? De lo contrario, el esquema esperado podría no coincidir.

Respuestas a la pregunta(6)

Su respuesta a la pregunta