Implementé un BackupAgentHelper
uso del proporcionado FileBackupHelper
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 con ContentProviders
y en la que reside /data/data/yourpackage/databases/
.
Uno pensaría que este es un caso común. Sin embargo, los documentos no están claros sobre qué hacer: http://developer.android.com/guide/topics/data/backup.html . No hayBackupHelper
específicamente para estas bases de datos típicas. Por lo tanto, utilicé elFileBackupHelper
, apunté a mi archivo .db en " /databases/
", introduje bloqueos alrededor de cualquier operación db (como db.insert
) en my ContentProviders
, e incluso intenté crear el /databases/
directorio " " antes onRestore()
porque no existe después de la instalación.
He implementado una solución similar con SharedPreferences
é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 LocalTransport
desde los registros, así como que se realiza (y se onRestore()
llama) una restauración . Sin embargo, el archivo db en sí nunca se crea.
Tenga en cuenta que todo esto es después de una instalación y antes del primer lanzamiento de la aplicación, después de que se haya realizado la restauración. Aparte de eso, mi estrategia de prueba se basó en http://developer.android.com/guide/topics/data/backup.html#Testing .
Tenga en cuenta también que no estoy hablando de una base de datos sqlite que administro yo mismo, ni de realizar copias de seguridad en una tarjeta SD, un servidor propio o en otro lugar.
Vi una mención en los documentos sobre las bases de datos que aconsejan usar una costumbre, BackupAgent
pero no parece estar relacionada:
Sin embargo, es posible que desee ampliar 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 vuelva a instalar su aplicación, necesita crear un BackupAgent 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.
Un poco de claridad por favor.
Si realmente necesito hacerlo yo mismo hasta el nivel de SQL, entonces me preocupan los siguientes temas:
Abrir bases de datos y transacciones. No tengo idea de cómo cerrarlos de una clase de singleton fuera del flujo de trabajo de mi aplicación.
Cómo notificar al usuario que se está realizando una copia de seguridad y 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 de restaurar 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 las identificaciones.
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 la copia de seguridad o restauración? De lo contrario, es posible que el esquema esperado no coincida.