J'ai implémenté un en BackupAgentHelper
utilisant le fourni FileBackupHelper
pour sauvegarder et restaurer la base de données native que j'ai. Il s'agit de la base de données que vous utilisez généralement avec ContentProviders
et qui réside dans /data/data/yourpackage/databases/
.
On pourrait penser que c'est un cas courant. Cependant, la documentation n'est pas claire sur ce qu'il faut faire: http://developer.android.com/guide/topics/data/backup.html . Il n'y a pas BackupHelper
spécifiquement pour ces bases de données typiques. Par conséquent, j'ai utilisé leFileBackupHelper
, je l'ai pointé vers mon fichier .db dans " /databases/
", j'ai introduit des verrous autour de toute opération de base de données (comme db.insert
) dans my ContentProviders
, et j'ai même essayé de créer le /databases/
répertoire " " avant onRestore()
car il n'existe pas après l'installation.
J'ai implémenté une solution similaire pour le SharedPreferences
succès dans une application différente dans le passé. Cependant, lorsque je teste ma nouvelle implémentation dans l'émulateur-2.2, je vois une sauvegarde effectuée à LocalTransport
partir des journaux, ainsi qu'une restauration en cours (et onRestore()
appelée). Pourtant, le fichier db lui-même n'est jamais créé.
Notez que tout cela se produit après une installation et avant le premier lancement de l'application, une fois la restauration effectuée. En dehors de cela, ma stratégie de test était basée sur http://developer.android.com/guide/topics/data/backup.html#Testing .
Veuillez noter également que je ne parle pas d'une base de données sqlite que je gère moi-même, ni d'une sauvegarde sur SDcard, sur mon propre serveur ou ailleurs.
J'ai vu une mention dans la documentation sur les bases de données conseillant d'utiliser une personnalisation BackupAgent
mais cela ne semble pas lié:
Cependant, vous souhaiterez peut-être étendre BackupAgent directement si vous avez besoin de: * Sauvegarder les données dans une base de données. Si vous disposez d'une base de données SQLite que vous souhaitez restaurer lorsque l'utilisateur réinstalle votre application, vous devez créer un BackupAgent personnalisé qui lit les données appropriées lors d'une opération de sauvegarde, puis créez votre table et insérez les données lors d'une opération de restauration.
Un peu de clarté s'il vous plaît.
Si j'ai vraiment besoin de le faire moi-même jusqu'au niveau SQL, je m'inquiète pour les sujets suivants:
Ouvrez les bases de données et les transactions. Je ne sais pas comment les fermer à partir d'une telle classe singleton en dehors du flux de travail de mon application.
Comment informer l'utilisateur qu'une sauvegarde est en cours et que la base de données est verrouillée. Cela peut prendre un certain temps, donc je devrai peut-être afficher une barre de progression.
Comment faire de même lors de la restauration. Si je comprends bien, la restauration peut se produire juste lorsque l'utilisateur a déjà commencé à utiliser l'application (et à saisir des données dans la base de données). Vous ne pouvez donc pas prétendre simplement restaurer les données sauvegardées sur place (en supprimant les données vides ou anciennes). Vous devrez en quelque sorte le rejoindre, ce qui pour toute base de données non triviale est impossible en raison des identifiants.
Comment actualiser l'application une fois la restauration terminée sans que l'utilisateur soit bloqué à un point - maintenant - inaccessible.
Puis-je être sûr que la base de données a déjà été mise à niveau lors d'une sauvegarde ou d'une restauration? Sinon, le schéma attendu pourrait ne pas correspondre.