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