Я реализовал 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, которой я управляю сам, ни о резервном копировании на SD-карту, собственный сервер или где-то еще.
Я действительно видел упоминание в документации о базах данных, рекомендующих использовать обычай, BackupAgent
но это не похоже на связь:
Однако вы можете напрямую расширить BackupAgent, если вам нужно: * Резервное копирование данных в базе данных. Если у вас есть база данных SQLite, которую вы хотите восстановить, когда пользователь переустанавливает ваше приложение, вам необходимо создать настраиваемый агент BackupAgent, который считывает соответствующие данные во время операции резервного копирования, затем создает вашу таблицу и вставляет данные во время операции восстановления.
Некоторая ясность, пожалуйста.
Если мне действительно нужно сделать это самому до уровня SQL, то меня беспокоят следующие темы:
Открытые базы данных и транзакции. Я понятия не имею, как закрыть их из такого одноэлементного класса вне рабочего процесса моего приложения.
Как уведомить пользователя о том, что выполняется резервное копирование и база данных заблокирована. Это может занять много времени, поэтому мне может потребоваться показать индикатор выполнения.
Как сделать то же самое при восстановлении. Насколько я понимаю, восстановление может произойти только тогда, когда пользователь уже начал использовать приложение (и вводить данные в базу данных). Таким образом, вы не можете себе позволить просто восстановить данные из резервной копии на месте (удалив пустые или старые данные). Вам придется как-то присоединиться к нему, что для любой нетривиальной базы данных невозможно из-за идентификатора.
Как обновить приложение после завершения восстановления, чтобы пользователь не застрял в какой-то - сейчас - недоступной точке.
Могу ли я быть уверен, что база данных уже была обновлена при резервном копировании или восстановлении? В противном случае ожидаемая схема может не совпадать.