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