J'ai implémenté un BackupAgentHelper
en utilisant le FileBackupHelper
fourni 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 les ContentProviders
et qui réside dans /data/data/votrepackage/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 de BackupHelper
spécifique pour ces bases de données typiques. J'ai donc utilisé le FileBackupHelper
, en lui indiquant mon fichier .db dans "/databases/
", en introduisant des verrous autour de toute opération de base de données (comme db.insert
) dans mes ContentProviders
, et même essayé de créer le répertoire "/databases/
" avant onRestore()
car il n'existe pas après l'installation.
J'ai mis en place une solution similaire pour les SharedPreferences
avec succès dans une autre application par le passé. Cependant, lorsque je teste ma nouvelle implémentation dans l'émulateur-2.2, je vois une sauvegarde être effectuée vers LocalTransport
depuis les logs, ainsi qu'une restauration (et l'appel à onRestore()
). Cependant, le fichier de base de données en lui-même n'est jamais créé.
Remarquez que tout cela se produit après une installation, et avant le premier lancement de l'application, après la restauration. En dehors de cela, ma stratégie de test était basée sur http://developer.android.com/guide/topics/data/backup.html#Testing.
Notez également que je ne parle pas d'une base de données SQLite que je gère moi-même, ni de sauvegarde sur une carte SD, un serveur personnel ou ailleurs.
J'ai vu une mention dans la documentation concernant les bases de données conseillant d'utiliser un BackupAgent
personnalisé, mais cela ne semble pas être lié :
Cependant, vous voudrez peut-être étendre directement BackupAgent si vous avez besoin de : * Sauvegarder des données dans une base de données. Si vous avez une base de données SQLite que vous souhaitez restaurer lorsque l'utilisateur réinstalle votre application, vous devez construire un BackupAgent personnalisé qui lit les données appropriées pendant une opération de sauvegarde, puis crée votre table et insère les données pendant une opération de restauration.
Un peu de clarté s'il vous plaît.
Si je dois vraiment le faire moi-même jusqu'au niveau SQL, alors je m'inquiète des points suivants :
-
Ouvrir des bases de données et des transactions. Je ne sais pas comment les fermer à partir d'une classe singleton en dehors du flux 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 du temps, donc je pourrais avoir besoin d'afficher une barre de progression.
-
Comment faire la même chose lors de la restauration. Comme je le comprends, la restauration peut se produire 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 supposer simplement restaurer les données sauvegardées en place (en supprimant les données vides ou anciennes). Vous devrez d'une manière ou d'une autre les fusionner, ce qui est impossible pour toute base de données non-triviale en raison des identifiants.
-
Comment rafraîchir l'application une fois la restauration terminée sans que l'utilisateur se retrouve bloqué à un point désormais inaccessible.
-
Puis-je être sûr que la base de données a déjà été mise à jour lors de la sauvegarde ou de la restauration ? Sinon, le schéma attendu peut ne pas correspondre.