4.7 KiB
4.7 KiB
Сессия 2026-09-21 (2) - экспорт/импорт всей БД (резервная копия)
Контекст
Смена сборки debug<->release стирает данные (разные подписи -> переустановка). Решили:
НЕ делать внутриприложенческую авто-установку APK, а сделать полный бэкап/восстановление БД.
Записано в память: project_no_self_install. Секретов в базе нет.
Сделано
- Rust (
lib.rs):db_and_root(app)- резолв путиbaldav.db+ app-root (как в rebuild_roads).export_db(filename)-VACUUM INTOчистой копии вapp-root/export_db.tmp(консистентно при живом соединении, сжимает ~на треть), командаexportdb:<filename>в gps_command.txt.import_db()- валидируетpicked_import.db(PRAGMA quick_check=='ok' + есть хоть одна таблица из gps_sessions/products/profile), копирует вpending_restore.db, удаляет picked.restart_app()- командаrestartapp.- Все три в generate_handler.
- Kotlin (
MainActivity.kt):pendingDbFile+saveDbLauncher(CreateDocument octet-stream, СТРИМ файла, не в память - файл десятки МБ).- Ветка
exportdb:-> SAF-сохранениеexport_db.tmp. - Ветка
restartapp-> relaunch (getLaunchIntentForPackage + FLAG_ACTIVITY_NEW_TASK) +Runtime.exit(0). onCreate(сразу после appDataDir, ДО открытия БД): если естьpending_restore.db- скопировать наbaldav.db, удалить journal/wal/shm и pending. Тот же паттерн, что копия сида.
- JS (
main.js): в Настройках блок «Резервная копия всех данных» с кнопками Экспорт/Импорт. Экспорт ->export_db. Импорт -> confirm (заменит всё) ->pickLocalFile->import_db-> confirm перезапуска ->restart_app. Импорт только на Android.
Проверка
- JS синтаксис ок. Автономный тест
VACUUM INTOна десктоп-БД: 53МБ -> 36МБ, quick_check ok, сессии на месте (валидная сжатая копия). Ядро экспорта подтверждено. - SAF-сохранение, своп при onCreate и рестарт - только на устройстве (Kotlin), десктоп не воспроизводит. Проверка на телефоне: экспорт -> файл-бэкап валиден; импорт другого бэкапа -> данные заменились после рестарта. (Сборка bump до 0.1.465.)
Замечания
- Сжатие gzip не делал: VACUUM INTO уже компактит; flate2 в зависимостях нет. Добавлю, если нужно меньше.
- Схема-совместимость: миграции в db.js идемпотентны (ALTER ... IF NOT EXISTS), старый бэкап подтянется вверх, новый в старое приложение - лишние колонки безвредны.
Проверка на теле + фиксы
- Экспорт сперва падал:
vacuum: unable to open database: /data/user/.... Причина - я взял корень какapp_data_dir().parent().parent()(на Android app_data_dir САМ = корень -> ../.. уводит в непишемый/data/user). ЭТО УЖЕ ЧИНИЛИ функциейnative_root(). Исправил наnative_root()(как save-команды/rebuild_roads), убрал data_dir-дубли. Записано в памятьreference_android_native_root. Подтверждено на теле: корень/data/user/0/dev.baldav.appписабелен, там baldav.db + точки + командные файлы -> native_root резолвится туда. - Экспорт + импорт (восстановление) пользователь проверил на теле - работают.
- Авто-рестарт после импорта не срабатывал:
startActivity()+exit(0)- гонка (процесс умирает до подъёма активити). Исправлено: relaunch через AlarmManager+PendingIntent ПОСЛЕ смерти процесса (ProcessPhoenix-паттерн) + finishAffinity.