我实现了一个BackupAgentHelper使用提供的FileBackupHelper来备份和恢复我有本机数据库。这是通常与ContentProviders一起使用的数据库,位于/ data / data / yourpackage / databases /中。

人们会认为这是一个普通的情况。但是文档不清楚该做什么:http:///guide/topics/data/backup.html.没有专门为这些典型数据库的BackupHelper。因此,我使用FileBackupHelper,指向我的.db文件在“/ databases /”,引入锁任何数据库操作(如db.insert)在我的ContentProviders,甚至尝试创建“/ databases /”目录之前onRestore (),因为它在安装后不存在。

我已经为SharedPreferences在过去的不同应用程序中成功实施了类似的解决方案。然而,当我在模拟器2.2测试我的新实现,我看到从LocalTransport执行的备份从日志,以及正在执行的还原(和onRestore()调用)。然而,db文件本身从未创建。

还请注意,我不是在谈论一些sqlite数据库我管理自己,也不关于备份到SDcard,自己的服务器或其他地方。

我没有看到文档中提到的数据库建议使用自定义BackupAgent,但它似乎不相关:

However, you might want to extend
BackupAgent directly if you need to:
* Back up data in a database. If you have an SQLite database that you
want to restore when the user
re-installs your application, you need
to build a custom BackupAgent that
reads the appropriate data during a
backup operation, then create your
table and insert the data during a
restore operation.

有些澄清。

如果我真的需要自己做到SQL级别,那么我担心以下主题:

>打开数据库和事务。我不知道如何从我的应用程序的工作流程之外的这样一个单例类关闭它们。

>如何通知用户备份正在进行并且数据库已锁定。这可能需要很长时间,所以我可能需要显示一个进度条。

>如何做同样的恢复。据我所知,恢复可能发生在用户已经开始使用应用程序(并将数据输入数据库)。因此,您不能假定只是恢复备份的数据(删除空或旧数据)。你必须以某种方式加入它,对于任何非平凡的数据库,由于id是不可能的。

>如何在恢复完成后刷新应用程序,而不让用户停留在某些 – 现在 – 不可达到的点。

>我可以确保数据库已在备份或还原时升级吗?否则,预期的模式可能不匹配。