Мой бэкап потерял все фотографии

Я создал кнопку резервного копирования для офлайн-трекера настроения.

Он экспортировал данные в JSON-файл. Пользователи могли сохранить его и перенести на новый телефон. Все казалось идеальным.

Затем я изменил ID пакета приложения. Я попробовал чистую установку на новом устройстве и восстановил данные из бэкапа.

Текстовые записи вернулись. Все фотографии исчезли.

Я осознал свою ошибку. Это был не настоящий бэкап. Это был просто список указателей на файлы, которых больше не существовало.

Приложение сохраняло фотографии на диск. В базе данных хранился путь к файлу.

Путь выглядел так: file:///data/user/0/com.example.app/files/entry_media/image.jpg

Когда я экспортировал JSON, я сохранял только этот путь. На том же устройстве импорт работает, потому что файлы все еще на месте.

На новом устройстве эти пути ведут в никуда. Пользователь видит битые миниатюры и думает, что приложение удалило его воспоминания.

Если ваш экспорт содержит только пути к файлам, у вас нет переносимого бэкапа. У вас есть бэкап, который работает только на том устройстве, которому он и не нужен.

Настоящий бэкап должен содержать сами данные.

Я изменил процесс. Теперь при экспорте каждая фотография считывается и преобразуется в строку Base64 внутри JSON.

У этого подхода есть свои недостатки: • Размер файла увеличивается примерно на 33 процента. • Большие библиотеки требуют больше памяти во время экспорта.

Я выбрал корректность вместо экономии места. Большой бэкап полезен. Крошечный бэкап, в котором потеряны все изображения, бесполезен.

Я также изменил способ обработки импорта, чтобы обеспечить скорость и безопасность:

  1. Сначала запишите все фотографии на диск нового устройства. Это происходит вне транзакции базы данных, чтобы сохранить скорость.
  2. Выполните одну транзакцию базы данных, чтобы связать новые локальные пути с записями.

Я также сделал систему устойчивой к ошибкам (fail soft). Если одна фотография отсутствует или не читается, приложение пропускает её и переходит к следующей. Одна битая картинка не должна приводить к сбою всего процесса восстановления.

Извлеченные уроки:

  • Тестируйте правильно. Сделайте экспорт на одном устройстве, очистите его и выполните импорт на чистой установке. Повторный импорт на том же устройстве скрывает баги.
  • Переносите байты. Если данные должны пережить смену устройства, перемещайте сами данные, а не адрес.

Источник: https://dev.to/diven_rastdus_c5af27d68f3/my-offline-apps-backup-lost-every-photo-on-a-new-phone-3d36