Резервное копирование / восстановление Android: как сделать резервную копию внутренней базы данных?

Я реализовал BackupAgentHelper , используя предоставленный FileBackupHelper для резервного копирования и восстановления собственной базы данных, которая у меня есть. Это база данных, которую вы обычно используете вместе с ContentProviders и которая находится в / data / data / yourpackage / databases / .

Можно подумать, что это обычный случай. Однако в документации неясно, что делать: http://developer.android.com/guide/topics/data/backup. html . Не существует BackupHelper специально для этих типичных баз данных. Поэтому я использовал FileBackupHelper , указал его на мой файл .db в « / databases / », ввел блокировки вокруг любой операции с базой данных (например, db.insert ) в моих ContentProvider и даже попытался создать каталог « / databases / » до onRestore () , потому что после установки он не существует.

Я ранее успешно реализовали подобное решение для SharedPreferences в другом приложении. Однако, когда я тестирую свою новую реализацию в эмуляторе 2.2, я вижу, что из журналов выполняется резервное копирование на LocalTransport , а также выполняется восстановление (и вызывается onRestore () ). Тем не менее, сам файл базы данных никогда не создается.

Обратите внимание, что это все после установки и перед первым запуском приложения, после того, как было выполнено восстановление. Кроме того, моя стратегия тестирования была основана на http://developer.android.com/guide/topics/data/backup.html#Testing .

Также обратите внимание, что я не говорю о некоторых База данных sqlite, которой я управляю сам, ни о резервном копировании на SD-карту, собственный сервер или где-то еще.

Я видел в документации упоминание о базах данных, в которых рекомендуется использовать специальный BackupAgent , но это не похоже на связь:

Однако вы можете захотеть расширить после того, как восстановление было выполнено. Кроме того, моя стратегия тестирования была основана на http://developer.android.com/guide/topics/data/backup.html#Testing .

Также обратите внимание, что я не говорю о некоторых База данных sqlite, которой я управляю сам, ни о резервном копировании на SD-карту, собственный сервер или где-то еще.

Я видел в документации упоминание о базах данных, в которых рекомендуется использовать специальный BackupAgent , но это не похоже на связь:

Однако вы можете захотеть расширить после того, как восстановление было выполнено. Кроме того, моя стратегия тестирования была основана на http://developer.android.com/guide/topics/data/backup.html#Testing .

Также обратите внимание, что я не говорю о некоторых База данных sqlite, которой я управляю сам, ни о резервном копировании на SD-карту, собственный сервер или где-то еще.

Я видел в документации упоминание о базах данных, в которых рекомендуется использовать специальный BackupAgent , но это не похоже на связь:

Однако вы можете захотеть расширить BackupAgent напрямую, если вам нужно: * Резервное копирование данных в базе данных. Если у вас есть база данных SQLite, которую вы хочу восстановить, когда пользователь переустанавливает ваше приложение, вам нужно создать собственный агент BackupAgent, который читает соответствующие данные во время операцию резервного копирования, затем создайте свой таблицу и вставьте данные во время операция восстановления.

Некоторая ясность, пожалуйста.

Если мне действительно нужно сделать это самому до уровня SQL, то меня беспокоят следующие темы:

  • Открытые базы данных и транзакции. Я понятия не имею, как закрыть их из такого одноэлементного класса вне рабочего процесса моего приложения.

  • Как уведомить пользователя о том, что выполняется резервное копирование и база данных заблокирована. Это может занять много времени, поэтому мне может потребоваться показать индикатор выполнения.

  • Как сделать то же самое при восстановлении. Насколько я понимаю, восстановление может произойти только тогда, когда пользователь уже начал использовать приложение (и вводить данные в базу данных). Таким образом, вы не можете себе позволить просто восстановить данные из резервной копии на месте (удалив пустые или старые данные). Вам придется как-то присоединиться к нему, что для любой нетривиальной базы данных невозможно из-за идентификатора.

  • Как обновить приложение после завершения восстановления, чтобы пользователь не застрял в какой-то - сейчас - недоступной точке.

  • Могу ли я быть уверен, что база данных уже была обновлена ​​при резервном копировании или восстановлении? В противном случае ожидаемая схема может не совпадать.

86
задан HitOdessit 29 October 2012 в 09:01
поделиться