我已经使用提供的 FileBackupHelper
实现了一个 BackupAgentHelper
,用于备份和恢复我拥有的本地数据库。这个数据库通常与 ContentProviders
一起使用,位于 /data/data/yourpackage/databases/
。
人们可能会认为这是一个常见的情况。然而文档没有明确说明要做什么:http://developer.android.com/guide/topics/data/backup.html。因此,没有专门针对这些典型数据库的 BackupHelper
。因此,我使用了 FileBackupHelper
,将其指向位于 "/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 数据库,也不是在备份到 SD 卡、自己的服务器或其他地方。
文档中提到了数据库,建议使用自定义的 BackupAgent
,但这似乎与此无关:
然而,您可能希望扩展
如果需要备份代理,请直接使用BackupAgent: * 备份数据库中的数据。如果您有一个SQLite数据库,想要在用户重新安装应用程序时还原它,那么您需要构建一个定制的BackupAgent,在备份操作期间读取相应数据,然后在还原操作期间创建表并插入数据。
一些澄清: 如果我确实需要自己完成SQL级别的工作,那么我会担心以下问题:
1. 打开数据库和事务。我不知道如何从这样一个单例类之外的应用程序工作流程中关闭它们。 2. 如何通知用户备份正在进行中,并且数据库已被锁定。这可能需要很长时间,因此我可能需要显示进度条。 3. 如何在恢复时执行相同的操作。据我所知,恢复可能发生在用户已经开始使用应用程序(并将数据输入到数据库)的情况下。因此,您不能假设只是在原地还原备份数据(删除空或旧数据)。你必须以某种方式加入它,对于任何非平凡的数据库来说,由于id的存在是不可能的。 4. 在还原完成后如何刷新应用程序,而不使用户卡在某个现在无法到达的点。 5. 我能否确信备份或还原过程中数据库已经升级?否则,期望的架构可能不匹配。