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