Вопросы об использовании Android Backup Service с базой данных SQLite

В моем приложении хранятся все пользовательские данные и настройки в базе данных SQLite, которые я бы хотел сохранить, если пользователь получает новый телефон, переустанавливает или выполняет factory reset. Я прочитал в Android Data Backup Guide и их Android Служба резервного копирования, но все еще есть некоторые вопросы, прежде чем я начну.

  • Восстановлены ли данные во время установки или при первом запуске моего приложения?, т.е. будет ли файл существовать до того, как будет вызван код для моего основного действия?
  • Если мой класс SQLiteOpenHelper уже обрабатывает обновления, есть ли что-то еще, что мне нужно сделать для восстановления старого db? Я предполагаю, что нет, если db существует до запуска моего приложения.
  • Я столкнулся с проблемами concurrency при резервном копировании, потому что BackupManager требует времени? Если пользователь вводит новые данные, и я вызываю dataChanged(), а затем снова повторяется, прежде чем BackupManager вызовет onBackup(), как будут обрабатываться эти данные? Будет ли BackupManager просто создавать резервную копию последней версии базы данных (которая должна включать оба изменения)?
  • С какими проблемами я столкнусь, пытаясь создать резервную копию/восстановить базу данных SQLite. Я видел, как разработчики говорят, что база данных на одном устройстве может быть несовместима с базой данных на другой. Я хотел бы просто создать резервную копию базы данных с помощью FileBackupHelper, потому что выглядит довольно просто. По крайней мере, один разработчик, по-видимому, решил, по крайней мере, некоторые проблемы совместимости, отключив запись записи Ahead Ahead. Если я возьму такой подход, какой бы показатель я мог ожидать? Если это очень важно, я могу перейти к преобразованию в файл CSV и обратно во время процесса.
  • Если сбой восстановления не удается, я могу его поймать, сообщить пользователю и сохранить копию проблемных данных для хранения? Для устранения неполадок и информирования пользователя.
  • Операция резервного копирования "не является потоковой". Уточните, как обращаться. Android говорит,

Чтобы ваш агент резервного копирования не читал или не записывал ваши файлы одновременно с вашими действиями, вы должны использовать синхронизированные операторы каждый раз, когда выполняете чтение или запись.

  • Означает ли это, что я должен помещать каждую запись/запись в мою базу данных в оператор synchronized? т.е. я должен добавить это в каждое место, где загружается моя активность с db или записывать информацию на нее? Это много мест.
  • Или это означает, что только код резервного копирования должен использовать synchronized?

Спасибо за помощь. Я просто хочу сделать это правильно и поддерживать своих пользователей счастливыми, когда они получат новые телефоны в это Рождество!

Ответ 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.

3: Поскольку ваши данные будут восстановлены во время установки, я не думаю, что вы столкнетесь с проблемами concurrency

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.

5: Я так не думаю.

6: "каждый раз, когда вы выполняете чтение или запись", кажется, не требует пояснений. Каждый раз, когда вы выполняете операцию над DB