Я 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, то мене турбують такі теми:
Відкриті бази даних та транзакції. Я не уявляю, як закрити їх із такого однокласного класу поза робочим процесом мого додатка.
Як повідомити користувача про те, що виконується резервне копіювання, а база даних заблокована. Це може зайняти багато часу, тому, можливо, мені доведеться показати індикатор прогресу.
Як зробити те ж саме при відновленні. Як я розумію, відновлення може відбутися саме тоді, коли користувач вже почав користуватися програмою (і вводити дані в базу даних). Тому ви не можете припустити, що просто відновите резервні копії даних на місці (видаливши порожні або старі дані). Вам доведеться якось приєднатися до цього, що для будь-якої нетривіальної бази даних неможливо через ідентифікатори.
Як оновити програму після відновлення, не застрягаючи користувача в якійсь - зараз - недосяжній точці.
Чи можу я бути впевненим, що базу даних вже оновлено при резервному копіюванні чи відновленні? В іншому випадку очікувана схема може не збігатися.