Ho implementato un BackupAgentHelper
utilizzo del fornito FileBackupHelper
per eseguire il backup e il ripristino del database nativo che ho. Questo è il database che di solito usi insieme ContentProviders
e in cui risiede /data/data/yourpackage/databases/
.
Si potrebbe pensare che questo sia un caso comune. Tuttavia, i documenti non sono chiari su cosa fare: http://developer.android.com/guide/topics/data/backup.html . Non esiste uno BackupHelper
specifico per questi database tipici. Quindi ho usato ilFileBackupHelper
, l'ho indirizzato al mio file .db in " /databases/
", ho introdotto blocchi su qualsiasi operazione db (come db.insert
) nel mio ContentProviders
, e ho anche provato a creare la /databases/
directory " " prima onRestore()
perché non esiste dopo l'installazione.
Ho implementato una soluzione simile per il SharedPreferences
successo in un'app diversa in passato. Tuttavia, quando provo la mia nuova implementazione nell'emulatore-2.2, vedo che viene eseguito un backup LocalTransport
dai log, così come viene eseguito (e onRestore()
chiamato) un ripristino . Tuttavia, il file db stesso non viene mai creato.
Tieni presente che tutto ciò avviene dopo un'installazione e prima del primo avvio dell'app, dopo che è stato eseguito il ripristino. A parte questo, la mia strategia di test era basata su http://developer.android.com/guide/topics/data/backup.html#Testing .
Si noti inoltre che non sto parlando di alcuni database sqlite che gestisco da solo, né di eseguire il backup su SDcard, sul proprio server o altrove.
Ho visto una menzione nei documenti sui database che consigliano di utilizzare un custom BackupAgent
ma non sembra correlato:
Tuttavia, potresti voler estendere BackupAgent direttamente se hai bisogno di: * Eseguire il backup dei dati in un database. Se si dispone di un database SQLite che si desidera ripristinare quando l'utente reinstalla l'applicazione, è necessario creare un BackupAgent personalizzato che legga i dati appropriati durante un'operazione di backup, quindi creare la tabella e inserire i dati durante un'operazione di ripristino.
Un po 'di chiarezza per favore.
Se ho davvero bisogno di farlo da solo fino al livello SQL, allora sono preoccupato per i seguenti argomenti:
Database aperti e transazioni. Non ho idea di come chiuderli da una classe così singleton al di fuori del flusso di lavoro della mia app.
Come notificare all'utente che è in corso un backup e il database è bloccato. Potrebbe volerci molto tempo, quindi potrei aver bisogno di mostrare una barra di avanzamento.
Come fare lo stesso durante il ripristino. Da quanto ho capito, il ripristino potrebbe avvenire proprio quando l'utente ha già iniziato a utilizzare l'app (e a inserire dati nel database). Quindi non puoi presumere di ripristinare solo i dati di backup in posizione (eliminando i dati vuoti o vecchi). Dovrai in qualche modo unirti a esso, il che per qualsiasi database non banale è impossibile a causa degli ID.
Come aggiornare l'app dopo il ripristino senza che l'utente si blocchi in un punto - ora - irraggiungibile.
Posso essere sicuro che il database sia già stato aggiornato durante il backup o il ripristino? In caso contrario, lo schema previsto potrebbe non corrispondere.