Подтвердить что ты не робот

Синхронизация данных Android между пользователями

У меня есть приложение для Android, которое поддерживает локальную базу данных SQLite разных географических мест.

Теперь я хотел бы связать эту базу данных с облаком, чтобы выполнить следующее:

  • начальная загрузка всего, когда приложение впервые установлено (или по запросу)

  • новые локации, которые были добавлены локально, должны быть загружены в облако (автоматически)

  • онлайн-базу данных необходимо периодически проверять на новые онлайн-записи и загружать в локальную базу данных.

У меня есть ряд проблем в этом.

Первый - это просто , как это сделать. Я думаю, что это включает contentProviders и syncProviders, но я точно не знаю, как это сделать. Нужно ли дублировать базу данных SQLite в contentProvider, или я допустил ошибку в базовом проекте, чтобы использовать базу данных напрямую, а не через пользовательский поставщик контента?

Во-вторых, записи местоположения нельзя просто скопировать вверх и вниз из онлайн-базы данных, так как они будут иметь конфликтующие идентификационные номера. У меня есть несколько реляционных таблиц, таких как "теги", которые связывают идентификатор тега с идентификатором местоположения. Мои теги-теги не обязательно совпадают с идентификаторами тегов других пользователей. То же самое с идентификаторами местоположения. Поэтому в передаче должна быть какая-то логика. Где/как это должно быть правильно обработано? Это роль contentResolver? (не уверен, что это на самом деле)

В-третьих, что происходит в случае, когда 2 пользователя одновременно добавляют одно и то же место (возможно, с разными описаниями и деталями)? Есть ли наилучшая практика для слияния этих записей?

Наконец, , что является самым простым способом создания/размещения онлайн-компонента? Эта часть для меня совершенно новая. Могу ли я просто поместить главную базу данных в общедоступную папку Dropbox, или мне нужно создать собственное веб-приложение php с нуля? Или есть готовое решение, облегчающее эту часть?

4b9b3361

Ответ 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.

так что отметьте отметку времени в таблице. и проверьте, что отметка времени и обновление соответственно.