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