Синхронизация данных Android между пользователями
У меня есть приложение для Android, которое поддерживает локальную базу данных SQLite разных географических мест.
Теперь я хотел бы связать эту базу данных с облаком, чтобы выполнить следующее:
-
начальная загрузка всего, когда приложение впервые установлено (или по запросу)
-
новые локации, которые были добавлены локально, должны быть загружены в облако (автоматически)
-
онлайн-базу данных необходимо периодически проверять на новые онлайн-записи и загружать в локальную базу данных.
У меня есть ряд проблем в этом.
Первый - это просто , как это сделать. Я думаю, что это включает contentProviders и syncProviders, но я точно не знаю, как это сделать. Нужно ли дублировать базу данных SQLite в contentProvider, или я допустил ошибку в базовом проекте, чтобы использовать базу данных напрямую, а не через пользовательский поставщик контента?
Во-вторых, записи местоположения нельзя просто скопировать вверх и вниз из онлайн-базы данных, так как они будут иметь конфликтующие идентификационные номера. У меня есть несколько реляционных таблиц, таких как "теги", которые связывают идентификатор тега с идентификатором местоположения. Мои теги-теги не обязательно совпадают с идентификаторами тегов других пользователей. То же самое с идентификаторами местоположения. Поэтому в передаче должна быть какая-то логика. Где/как это должно быть правильно обработано? Это роль contentResolver? (не уверен, что это на самом деле)
В-третьих, что происходит в случае, когда 2 пользователя одновременно добавляют одно и то же место (возможно, с разными описаниями и деталями)? Есть ли наилучшая практика для слияния этих записей?
Наконец, , что является самым простым способом создания/размещения онлайн-компонента? Эта часть для меня совершенно новая. Могу ли я просто поместить главную базу данных в общедоступную папку Dropbox, или мне нужно создать собственное веб-приложение php с нуля? Или есть готовое решение, облегчающее эту часть?
Ответы
Ответ 1
Вы должны обязательно использовать ContentProvider
и SyncAdapters
. Вы должны:
- Оберните функциональность базы данных с помощью интерфейса
ContentProvider
- Установите a
SyncService
, соответствующий полномочию ContentProvider
- В вашей специализации
SyncAdapter
вы переопределите onPerformSync()
-
Используйте хранилище SharedPreferences
, чтобы отслеживать параметры синхронизации, например. lastSync и т.д.
final SharedPreferences syncMeta =
mContext.getSharedPreferences("sync:" + account.name, 0);
long lastSyncTime = syncMeta.getLong(LAST_SYNC, 0);
long lastServerSyncTime = syncMeta.getLong(SERVER_LAST_SYNC, 0);
-
Это может легко сказать вам, если его первая синхронизация и вы можете сделать начальную обработку здесь
- Вы напишете свой алгоритм здесь для синхронизации i.e одним способом/двумя способами.
- Мне удобно записывать временные метки и идентификатор базы данных сервера в ваши записи Android, чтобы помочь с синхронизацией. Это может помочь вам с вашей стратегией слияния.
-
Используйте ContentProvider здесь для операций с БД. ContentProviders предоставляют единый способ доступа к вашим данным из вашего приложения, а также к адаптерам синхронизации. Они будут уведомлять систему обновлений, чтобы синхронизация структуры и расписания. Они также могут быть полезны в качестве публичных интерфейсов ваших данных для других приложений, если вы решите это сделать.
-
Кроме того, с помощью SyncService вы сохраняете батарею. Система будет использовать сетевые щекотки для выполнения операций синхронизации и, что самое главное, если они будут объединены для всех приложений, а не для каждого приложения, просыпающегося в системе.
Наконец,
Есть два образца, на которые вы должны посмотреть. Они в значительной степени охватывают все, что я объяснил.
Оба этих приложения используют Google App Engine для облачного компонента. Его легко начать, так что обязательно изучите эти варианты.
Ответ 2
Сначала создайте локальную БД в android. и ур. после сохранения отправляется в облачную/серверную БД.
В следующий раз U нужно синхронизировать ту облачную/серверную БД. поэтому напишите службу в android, например, сделайте определенный интервал и синхронизируйте с clound/server DB.
так что отметьте отметку времени в таблице. и проверьте, что отметка времени и обновление соответственно.