android - Android备份/恢复:如何备份内部数据库?

我已经使用提供的BackupAgentHelper实现了一个FileBackupHelper来备份和还原我拥有的本机数据库。这是您通常与ContentProviders一起使用的数据库,它位于/data/data/yourpackage/databases/中。
人们会认为这是一个常见的情况。但是,文档不清楚要做什么:http://developer.android.com/guide/topics/data/backup.html。对于这些典型的数据库,没有专门的BackupHelper因此,我使用了FileBackupHelper,将其指向“/databases/中的.db文件,在我的db.insert中引入了任何db操作(如ContentProviders)的锁,甚至尝试在/databases/之前创建“onRestore()目录,因为它在安装后不存在。
我以前在不同的应用程序中成功地为SharedPreferences实现了类似的解决方案。但是,当我在Emulator-2.2中测试新的实现时,我看到正在从日志中执行到LocalTransport的备份,以及正在执行的还原(和调用的还原)。然而,数据库文件本身从未被创建。
请注意,这一切都是在安装之后、首次启动应用程序之前、执行恢复之后进行的。除此之外,我的测试策略基于http://developer.android.com/guide/topics/data/backup.html#Testing
请注意,我不是在谈论我自己管理的一些sqlite数据库,也不是在谈论备份到SD卡、自己的服务器或其他地方。
我确实在文档中看到过关于建议使用自定义数据库的提到,但似乎与以下内容无关:
但是,您可能希望扩展
如果需要,直接使用backupagent:
*备份数据库中的数据。如果您有一个sqlite数据库,
希望在用户
重新安装应用程序,您需要
创建自定义备份代理

备份操作,然后创建
表并在
恢复操作。
请讲清楚。
如果我真的需要自己做到SQL级别,那么我担心以下主题:
打开数据库和事务。我不知道如何在我的应用程序工作流之外从这样一个单例类关闭它们。
如何通知用户备份正在进行且数据库已锁定。这可能需要很长时间,所以我可能需要显示一个进度条。
如何在还原时执行相同的操作。据我所知,当用户已经开始使用应用程序(并将数据输入数据库)时,还原可能会发生。因此,您不能假定只在适当的位置恢复备份的数据(删除空数据或旧数据)。您必须以某种方式将其加入,对于任何重要的数据库来说,由于ID的存在,这是不可能的。
如何在恢复完成后刷新应用程序,而不让用户陷入某个现在无法到达的点。
我可以确定数据库在备份或还原时已经升级了吗?否则,预期的架构可能不匹配。


最佳答案:

更清洁的方法是创建一个自定义的

public class DbBackupHelper extends FileBackupHelper {

    public DbBackupHelper(Context ctx, String dbName) {
        super(ctx, ctx.getDatabasePath(dbName).getAbsolutePath());
    }
}

然后将其添加到BackupHelper
public void onCreate() {
    addHelper(DATABASE, new DbBackupHelper(this, DB.FILE));
}