Как синхронизировать SQLite и MySQL в Android, Kotlin?
Пишу приложение для Андроид на котлин. В нём есть локальная БД SQLite. Так же есть удалённый веб сервер и в нём БД MySQL. Необходимо сделать примерно такую логику: Если в локальной есть записи, которых нет в сетевой - то в сетевую добавляются недостающие записи. Если в сетевой есть записи, которых нет в локальной - то в локальную добавляются эти записи.
Собственно вопрос - есть ли готовые решения или архитектурные советы по поводу реализации?
Сам думаю сделать отдельно php скрипт для получения и записи данных в удалённую бд, и уже с приложения отправлять json на этот скрипт, а он в свою очередь будет записывать, и наоборот.
P.S.: база будет маленькая, 1 таблица, на 30-50 записей по 6 полей. В будущем масштабироваться НЕ будет. Вся суть будет в изменениях существующих полей, и периодически добавление новых.
Ответы (2 шт):
Не вижу смысла усложнять себе жизнь с отслеживанием актуального состояния в удаленной и локальной БД. Лучше напиши простенький сервер на java/kotlin/GoLang... с предоставлением API запросов к твоей удаленной БД. Так же в пользу написания своего API:
- Что делать если у пользователя нет интернета и его локальная БД обновилась после чего он очистил данные приложения и локальная БД стала чистой :)
- Пользователь может отключиться от интернета изменить БД как ему хочется и включить интернет, на сервер попадут не хорошие данные (не уверен)
- Чем меньше весит приложение тем больше оно нравится пользователю
Готовых решений нет. Но задача довольно тривиальная. Архитектура 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)