我已经实现了一个 BackupAgentHelper
使用提供的 FileBackupHelper
备份和恢复本地数据库我有。这是通常与 ContentProviders
一起使用的数据库,它驻留在 /data/data/yourpackage/databases/
中。
人们会认为这是一个普遍的情况。然而,医生并不清楚该做什么: http://developer.android.com/guide/topics/data/backup.html。指向我的。在“ /databases/
”中创建 db 文件,在我的 ContentProviders
中引入了围绕任何 db 操作(比如 db.insert
)的锁,甚至尝试在 onRestore()
之前创建“ /databases/
”目录,因为它在安装后不存在。
我曾经在一个不同的应用程序中成功地为 SharedPreferences
实现了一个类似的解决方案。但是,当我在模拟器2.2中测试我的新实现时,我看到从日志执行到 LocalTransport
的备份,以及执行恢复(并调用 onRestore()
)。然而,从未创建过 db 文件本身。
请注意,这都是在安装之后,在首次启动应用程序之前,在执行恢复之后。除此之外,我的测试策略是基于 http://developer.android.com/guide/topics/data/backup.html#Testing的。
还请注意,我不是说一些 sqlite 数据库我管理自己,也不是关于备份到 SDcard,自己的服务器或其他地方。
我确实在文档中看到过关于建议使用定制 BackupAgent
的数据库的提及,但它似乎并不相关:
但是,您可能想要延长 如果需要,可以直接使用 BackupAgent: * 备份数据库中的数据 要还原时,用户 重新安装你的应用程序,你需要 构建自定义的 BackupAgent 读取适当的数据 备份操作,然后创建 表中插入数据 恢复操作。
说清楚点。
如果我真的需要自己做到 SQL 级别,那么我担心以下主题:
打开数据库和事务。我不知道如何关闭我的应用程序的工作流之外的这样一个单例类。
如何通知用户备份正在进行且数据库已锁定。这可能需要很长时间,所以我可能需要显示一个进度条。
如何在恢复时做同样的事情。据我所知,还原可能发生在用户已经开始使用应用程序(并将数据输入数据库)的时候。因此,您不能假定只是将备份的数据还原到位(删除空数据或旧数据)。您必须以某种方式加入它,这对于任何非平凡的数据库来说都是不可能的,因为 id 的。
如何在恢复完成后刷新应用程序,而不会让用户卡在某个现在无法到达的地方。
我是否可以确定数据库已经在备份或还原时进行了升级?否则,预期的架构可能不匹配。