我已经使用提供的FileBackupHelper实现了BackupAgentHelper,以备份和恢复我拥有的本机数据库.这是您通常与ContentProviders一起使用的数据库,它驻留在/data/data/yourpackage/databases/中.

人们会认为这是一种常见的情况.然而,doctor 们并不清楚该怎么做:http://developer.android.com/guide/topics/data/backup.html.There is no 101 specifically for these typical databases. Hence I used the 102,将其指向"/databases/"中的.db文件,在ContentProviders中的任何db操作(如db.insert)周围引入锁定,甚至try 在onRestore()之前创建"/databases/"目录,因为它在安装后不存在.

过go ,我在不同的应用程序中成功地为SharedPreferences人实现了类似的解决方案.然而,当我在emulator-2.2中测试我的新实现时,我看到正在从日志(log)中执行到LocalTransport的备份,以及正在执行的恢复(并调用onRestore()).Yet, the db file itself is never created.

请注意,这一切都是在安装之后、首次启动应用程序之前、执行恢复之后进行的.除此之外,我的测试策略是基于http://developer.android.com/guide/topics/data/backup.html#Testing.

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

我确实在文档中看到关于建议使用定制BackupAgent的数据库的提及,但这似乎并不相关:

但是,您可能希望扩展 如果您需要执行以下操作,请直接使用BackupAgent: *备份数据库中的数据.如果您有一个SQLite数据库, 想要在用户 重新安装您的应用程序,您需要 要构建自定义BackupAgent,请执行以下操作 期间读取相应的数据. 备份操作,然后创建您的 表,并在 恢复操作.

Some clarity please.

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

  • 开放数据库和事务.我不知道如何在我的应用程序工作流程之外关闭这样一个单例类.

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

  • 如何在恢复时执行同样的操作.据我所知,恢复可能发生在用户已经开始使用应用程序(并将数据输入数据库)的时候.因此,您不能假定只恢复备份的数据(删除空数据或旧数据).您必须以某种方式加入它,这对于任何非平凡的数据库来说都是不可能的,因为id的原因.

  • 如何在恢复完成后刷新应用程序,而不会让用户停留在某个现在无法访问的点上.

  • 我是否可以确保数据库已在备份或还原时升级?否则,预期的架构可能不匹配.

推荐答案

一个更干净的方法是创建一个定制的BackupHelper:

public class DbBackupHelper extends FileBackupHelper {

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

然后将其加到BackupAgentHelper:

public void onCreate() {
    addHelper(DATABASE, new DbBackupHelper(this, DB.FILE));
}

Database相关问答推荐

找不到复制副本集

如果我想支持我的工作负载,我需要多少个 node ?

Postgresql 服务器:允许访问私有网络内的远程连接,而不是外部网络

android 应用程序与 web 服务通信的安全性

用于为 Android 设计 SQLite 数据库的开发人员工具

如何识别 DB2 端口号

TSQL - 表值函数中的 If..Else 语句 - 无法通过

Followers/following 关注者表数据库 struct

SQL 历史(history)表设计

在 sql server 中存储持续时间(时间跨度)

每个请求可以多次查询 MongoDB 吗?

无法在 MYSQL 5.5 w/MYSQL Workbench 中更改模式名称

返回 DataSet/DataTable 的 PowerShell 函数中的奇怪行为

在 SQL 数据库之间共享数据

如何在 PostgreSQL 事务中获得实时?

如何使用 django 判断 postgresql 数据库中是否存在某些内容?

如何在没有验证提取的情况下将 MSSQLServer 数据库提取为 .dacpac?

如何在多列上创建 FULLTEXT 索引?

我应该混淆用户的数据库 ID 吗?

如何在 SQL Server 中删除多个数据库