Как синхронизировать SQLite и MySQL в Android, Kotlin?

Рейтинг: 0Ответов: 2Опубликовано: 03.04.2023

Пишу приложение для Андроид на котлин. В нём есть локальная БД SQLite. Так же есть удалённый веб сервер и в нём БД MySQL. Необходимо сделать примерно такую логику: Если в локальной есть записи, которых нет в сетевой - то в сетевую добавляются недостающие записи. Если в сетевой есть записи, которых нет в локальной - то в локальную добавляются эти записи.

Собственно вопрос - есть ли готовые решения или архитектурные советы по поводу реализации?

Сам думаю сделать отдельно php скрипт для получения и записи данных в удалённую бд, и уже с приложения отправлять json на этот скрипт, а он в свою очередь будет записывать, и наоборот.

P.S.: база будет маленькая, 1 таблица, на 30-50 записей по 6 полей. В будущем масштабироваться НЕ будет. Вся суть будет в изменениях существующих полей, и периодически добавление новых.

Ответы

▲ 0Принят

Готовых решений нет. Но задача довольно тривиальная. Архитектура MVVM или MVP (на вкус) + Retrofit + RestAPI + Offline Repository SQlite.

Для начала развертываешь backend на сервере с внешним IP. (Ubnt + Apache + PHP + Mysql). Передаешь JSON из PHP (create, read, update, delet) вида: echo json_encode($response); который далее будешь передавать в Retrofit и конвертировать через библиотеку GsonConverterFactory. В phpmyadmin создаешь базу, создаешь таблицу. Делаешь Android CRUD приложение. Архитектура до безобразия простая: Rest API + Retrofit + DataModel + ResponseModel. Подключение к удаленному серверу с БД будешь получать через OkHttp. С этим понятно. Далее.

Берешь ту же архитектуру CRUD и делаешь кеширование в SQlite с библиотекой Room. Для начала делаешь модель DAO с сохранением в репозиторий SQlite. Пишешь функцию проверки линка (интернет или сервер связь) fun isOnline и fun isOffline через if else связываешь архитектуру CRUD с той или иной моделью. Проще говоря, указываешь в случае отсутствия связи интернет или связи с удаленным сервером или с БД какую модель задействовать.

Выгрузку данных из локального репозитория в удаленную MуSQL БД делаешь автоматически и асинхронно в случае появления интернета/связи с БД. И очищаешь кеш Room. Это один из путей и на мой взгляд наиболее правильный. Второй путь это синхронизация обоих БД. Что не есть гуд. Так как: а) сильно утяжелит проект, б) постоянно будет отжирать трафик юзера (так как этот самый синхронайз будет в риал тайме), и в) есть много нюансов в реализации (кода точно добавит много)

На мой взгляд лучше использовать риал тайм firebase гугловую. У нее уже встроена возможность работы с offline из коробки. Достаточно просто указать: setPersistenceEnabled(true)

▲ 0

Не вижу смысла усложнять себе жизнь с отслеживанием актуального состояния в удаленной и локальной БД. Лучше напиши простенький сервер на java/kotlin/GoLang... с предоставлением API запросов к твоей удаленной БД. Так же в пользу написания своего API:

  1. Что делать если у пользователя нет интернета и его локальная БД обновилась после чего он очистил данные приложения и локальная БД стала чистой :)
  2. Пользователь может отключиться от интернета изменить БД как ему хочется и включить интернет, на сервер попадут не хорошие данные (не уверен)
  3. Чем меньше весит приложение тем больше оно нравится пользователю