@JarekPotiuk Вы сказали: «большинство людей (несмотря на подход курсора менеджера контента Android)». Но что заставляет вас думать, что большинство людей будут избегать использования ContentProvider и ContentResolver для доступа к базе данных?

лизовал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() называется).Тем не менее, сам файл БД никогда не создается.

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

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

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

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

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

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

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

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

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

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

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