相关疑难解决方法(0)

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

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

人们会认为这是一个常见的情况.但是,文档不清楚该怎么做:http://developer.android.com/guide/topics/data/backup.html.这些典型的数据库并不BackupHelper专门.因此,我使用了FileBackupHelper,将它指向我在."中的.db文件,在我的/databases/任何数据库操作(例如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的原因,任何非平凡的数据库都是不可能的.

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

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

database android restore database-restore android-backup-service

86
推荐指数
5
解决办法
4万
查看次数

有关在SQLite数据库中使用Android备份服务的问题

我的应用程序将所有用户数据和首选项存储在SQLite数据库中,如果用户获得新手机,重新安装或恢复出厂设置,我希望将其保留.我已经在Android的数据备份指南和他们的Android备份服务中做了一些阅读,但在我开始之前仍然有一些问题.

  1. 是在安装期间还是在我的应用程序首次启动时恢复数据?即,在调用主Activity的代码之前文件是否存在?
  2. 如果我的SQLiteOpenHelper类已经处理升级,那么我还需要做些什么来处理旧数据库的恢复吗?我假设没有,如果在我的应用程序启动之前存在数据库.
  3. 备份时是否会遇到并发问题,因为BackupManager需要时间?如果用户输入新数据并且我调用dataChanged()然后在BackupManager调用之前再次发生相同的事情onBackup(),那么这些数据更改将如何处理?BackupManager是否只备份最新版本的数据库(应该包括两个更改)?
  4. 尝试备份/恢复SQLite数据库会遇到什么问题?我见过开发人员说一台设备上的数据库可能与另一台设备上的数据库不兼容.我想简单地使用备份数据库FileBackupHelper,因为它看起来很简单.至少有一个开发人员似乎通过禁用Write Ahead Logging解决了至少一些兼容性问题.如果我采用这种方法,我可以期待什么样的失败率?如果非常高,我可能会考虑转换为CSV文件并在此过程中返回.
  5. 如果还原失败,我可以捕获它,通知用户,并将麻烦的数据副本保存到存储中吗? 用于故障排除和通知用户.
  6. 备份操作"不是线程安全的".澄清如何处理. Android说,

要确保备份代理不会在活动的同时读取或写入文件,每次执行读取或写入时都必须使用synchronized语句.

  • 这是否意味着我必须在synchronized语句中对每个数据库进行读/写操作?即,我必须将此添加到我的活动从数据库加载或写入信息的每个地方?那是很多地方.
  • 或者它是否只表示备份代码必须使用synchronized

谢谢您的帮助.我只是想做到这一点,让我的用户在今年圣诞节获得新手机时感到高兴!

database sqlite android android-file android-backup-service

12
推荐指数
1
解决办法
509
查看次数