Implementei um BackupAgentHelper
usando o fornecido FileBackupHelper
para fazer backup e restaurar o banco de dados nativo que tenho. Este é o banco de dados que você normalmente usa junto com o ContentProviders
qual reside /data/data/yourpackage/databases/
.
Alguém poderia pensar que este é um caso comum. No entanto, os documentos não são claros sobre o que fazer: http://developer.android.com/guide/topics/data/backup.html . Não há nenhum BackupHelper
específico para esses bancos de dados típicos. Portanto, usei oFileBackupHelper
, apontei para meu arquivo .db em " /databases/
", introduzi bloqueios em qualquer operação db (como db.insert
) em meu ContentProviders
e até tentei criar o /databases/
diretório " " antes onRestore()
porque ele não existe após a instalação.
Implementei uma solução semelhante para o SharedPreferences
sucesso em um aplicativo diferente no passado. No entanto, quando testo minha nova implementação no emulador-2.2, vejo um backup sendo executado a LocalTransport
partir dos logs, bem como uma restauração sendo realizada (e onRestore()
chamada). No entanto, o próprio arquivo db nunca é criado.
Observe que tudo isso ocorre após a instalação e antes da primeira inicialização do aplicativo, após a execução da restauração. Além disso, minha estratégia de teste foi baseada em http://developer.android.com/guide/topics/data/backup.html#Testing .
Observe também que não estou falando sobre algum banco de dados sqlite que eu mesmo gerencio, nem sobre backup em SDcard, servidor próprio ou em outro lugar.
Eu vi uma menção nos documentos sobre bancos de dados que aconselham o uso de um personalizado, BackupAgent
mas não parece relacionado:
No entanto, você pode desejar estender o BackupAgent diretamente se precisar: * Fazer backup dos dados em um banco de dados. Se você tiver um banco de dados SQLite que deseja restaurar quando o usuário reinstalar seu aplicativo, será necessário construir um BackupAgent personalizado que leia os dados apropriados durante uma operação de backup e, em seguida, crie sua tabela e insira os dados durante uma operação de restauração.
Alguma clareza, por favor.
Se eu realmente preciso fazer isso sozinho até o nível SQL, estou preocupado com os seguintes tópicos:
Abra bancos de dados e transações. Não tenho ideia de como fechá-los a partir de uma classe única fora do fluxo de trabalho do meu aplicativo.
Como notificar o usuário de que um backup está em andamento e o banco de dados está bloqueado. Pode demorar muito, então posso precisar mostrar uma barra de progresso.
Como fazer o mesmo na restauração. Pelo que entendi, a restauração pode acontecer apenas quando o usuário já começou a usar o aplicativo (e inserir dados no banco de dados). Portanto, você não pode presumir apenas restaurar os dados do backup no local (excluindo os dados vazios ou antigos). Você terá que juntá-lo de alguma forma, o que para qualquer banco de dados não trivial é impossível devido ao id.
Como atualizar o aplicativo após a restauração sem deixar o usuário preso em algum ponto - agora - inacessível.
Posso ter certeza de que o banco de dados já foi atualizado no backup ou restauração? Caso contrário, o esquema esperado pode não corresponder.