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

NSo*_*uth 12 database sqlite android android-file android-backup-service

我的应用程序将所有用户数据和首选项存储在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

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

The*_*Fox 1

来自Android 文档

这应该可以回答您的问题 1 和 2:

Android automatically performs a restore operation when your application is installed and there 
exists backup data associated with the user. The primary scenario in which backup data is restored 
is when a user resets their device or upgrades to a new device and their previously installed 
applications are re-installed.
Run Code Online (Sandbox Code Playgroud)

3:由于您的数据将在安装过程中恢复,我认为您不会遇到并发问题

4:

Data backup is not guaranteed to be available on all Android-powered devices. However, your   
application is not adversely affected in the event that a device does not provide a backup 
transport. If you believe that users will benefit from data backup in your application, then you can 
implement it as described in this document, test it, then publish your application without any 
concern about which devices actually perform backup.
Run Code Online (Sandbox Code Playgroud)

5:我不这么认为。

6:“每次执行读取或写入”似乎是不言自明的。每次对数据库进行操作时