Я реализовал BackupAgentHelper
, используя предоставленный FileBackupHelper
для резервного копирования и восстановления собственной базы данных, которую у меня есть. Это база данных, которую вы обычно используете вместе с ContentProviders
и которая находится в /data/data/yourpackage/databases/
.
Можно подумать, что это обычный случай. Однако в документах не ясно, что делать: http://developer.android.com/guide/topics/data/backup.html. Для этих типичных баз данных нет BackupHelper
. Поэтому я использовал FileBackupHelper
, указав его на мой .db файл в "/databases/
", представил блокировки вокруг любой операции db (например, 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, то меня беспокоят следующие темы:
-
Откройте базы данных и транзакции. Я не знаю, как закрыть их из такого одноэлементного класса за пределами рабочего процесса моего приложения.
-
Как уведомить пользователя о том, что резервная копия находится в процессе, и база данных заблокирована. Это может занять много времени, поэтому мне может потребоваться показать индикатор выполнения.
-
Как сделать то же самое при восстановлении. Насколько я понимаю, восстановление может произойти только тогда, когда пользователь уже начал использовать приложение (и вводит данные в базу данных). Поэтому вы не можете позволить просто восстановить резервные данные на месте (удаление пустых или старых данных). Вам придется каким-то образом присоединиться к нему, что для любой нетривиальной базы данных невозможно из-за идентификатора.
-
Как обновить приложение после завершения восстановления, не заставляя пользователя застревать в какой-то - теперь недоступной точке.
-
Могу ли я быть уверенным, что база данных уже была обновлена при резервном копировании или восстановлении? В противном случае ожидаемая схема может не совпадать.