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

Я хочу синхронизировать данные (например, запись db, media) между Android-приложением и сервером. Если вы видели Evernote или подобные приложения, вы, безусловно, понимаете, что я имею в виду.

У меня есть вопрос (представьте, что мы хотим синхронизировать записи БД):

  • Каждый пользователь имеет часть пространства сервера для себя (например, Evernote или Dropbox). Возможно, пользователь создает новые записи по мобильному телефону и создает новые записи на сервере. Как я могу сопоставить эти записи вместе? Если есть записи с одинаковым ID Какие алгоритмы вы предлагаете мне?

  • За исключением JSON, Есть ли способ отправить данные между мобильным устройством и сервером?

  • Если SyncAdapter и ContentProvider могут решить мои проблемы, объясните, пожалуйста, именно для меня. (Если бы вы могли предложить мне несколько образцов или учебных пособий, или любые советы или ключевые слова, которые помогут расширить/направлять мой поиск, также будут оценены).

Ответ 1

Я постараюсь ответить на все ваши вопросы, обратившись к большему вопросу: Как синхронизировать данные между веб-сервером и андроидным приложением?


Синхронизация данных между вашим веб-сервером и Android-приложением требует наличия на вашем устройстве Android нескольких компонентов.

Постоянное хранилище:

Так ваш телефон фактически сохраняет данные, которые он получает с веб-сервера. Одним из возможных способов достижения этого является создание собственного пользовательского ContentProvider, поддерживаемого базой данных Sqlite. Порядочный учебник для поставщика контента можно найти здесь: http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-contentprovider/

ContentProvider определяет согласованный интерфейс для взаимодействия с вашими сохраненными данными. Это может также позволить другим приложениям взаимодействовать с вашими данными, если вы хотите. За вашим ContentProvider может быть база данных Sqlite, кэш или любой произвольный механизм хранения.

Хотя я бы рекомендовал использовать ContentProvider с базой данных Sqlite, вы могли бы использовать любой механизм хранения на основе Java, который вы хотели.

Формат обмена данными:

Это формат, который вы используете для отправки данных между вашим веб-сервером и вашим Android-приложением. Двумя самыми популярными форматами в наши дни являются XML и JSON. При выборе формата вы должны подумать о том, какие библиотеки сериализации доступны. Я знаю, что там есть фантастическая библиотека для сериализации json под названием gson: https://github.com/google/gson, хотя я уверен, что подобные библиотеки существуют для XML.

Служба синхронизации

Вам понадобится какая-то асинхронная задача, которая может получить новые данные с вашего сервера и обновить мобильный контент, чтобы отразить содержимое сервера. Вы также захотите уведомить об этом сервер при внесении локальных изменений в контент и хотите отразить эти изменения. Android обеспечивает шаблон SyncAdapter как способ легко решить этот шаблон. Вам нужно будет зарегистрировать учетные записи пользователей, а затем Android выполнит много волшебства для вас и позволит вам автоматически синхронизировать. Вот хороший учебник: http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/


Что касается того, как вы определяете, совпадают ли записи, обычно вы создадите элементы с уникальным идентификатором, который вы храните как на устройстве Android, так и на сервере. Вы можете использовать это, чтобы убедиться, что вы ссылаетесь на одну и ту же ссылку. Кроме того, вы можете хранить атрибуты столбцов, такие как "updated_at", чтобы убедиться, что вы всегда получаете самые свежие данные или вы случайно не записываете новые записанные данные.

Ответ 2

Если мы думаем о сегодняшнем дне, принятый ответ слишком стар. Поскольку мы знаем, что у нас есть много новых библиотек, которые могут помочь вам в создании приложений такого типа.

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

  • SyncAdapter. Компонент адаптера синхронизации в приложении содержит код для задач, которые передают данные между устройством и сервером. На основе расписания и триггеров, которые вы предоставляете в своем приложении, платформа адаптера синхронизации запускает код в компоненте адаптера синхронизации.

  • Realm: Realm - это мобильная база данных: замена SQLite и Core Data.

  • Модифицированный HTTP-клиент с безопасным типом для Android и Java от Square, Inc. Обязательно изучите умный способ использования для модернизации

И ваша логика синхронизации для базы данных, например: Как синхронизировать базу данных SQLite на телефоне Android с базой данных MySQL на сервере?

Удачи всем новым ученикам. :)

Ответ 3

Если вы пишете это сами, это некоторые из соображений, которые следует иметь в виду

Надлежащая проверка подлинности между устройством и сервером синхронизации

Протокол синхронизации между устройством и сервером. Обычно это происходит в 3 этапа, аутентификация, обмен данными, обмен состояниями (какие операции выполнялись и которые не выполнялись)

Выберите формат своей полезной нагрузки. Я предлагаю XML на основе SyncML, смешанный с форматом JSON, для представления фактических данных. Итак, SyncML для протокола и JSON для обмена фактическими данными. Использование массива JSON при работе с данными всегда предпочтительнее, так как легко получить доступ к данным с помощью массива JSON.

Отслеживание изменений данных как на клиенте, так и на сервере. Вы можете сохранить список изменений, которые изменяются и подбирают их во время сеанса синхронизации. Кроме того, очистите журнал изменений, поскольку объекты успешно синхронизированы. Вы также можете использовать логическую переменную для подтверждения состояния синхронизации, то есть в последний раз синхронизации. Конечным пользователям будет полезно определить время последней синхронизации.

Необходимо иметь способ связи с сервером на устройстве, чтобы начать сеанс синхронизации, как изменения данных на сервере. Вы можете использовать C2DM или написать собственную постоянную связь на основе tcp. Подход tcp очень плавный

Способ репликации изменений данных на нескольких устройствах

И последнее, но не менее важное: способ обнаружения и обработки конфликтов

Надеюсь, это поможет в качестве хорошей отправной точки.

Ответ 4

@Grantismo дает отличное объяснение в целом. Если вы хотите знать, кто на самом деле делает это, я предлагаю вам взглянуть на то, как Google сделал приложение IO для Google 2014 (всегда стоит внимательно изучить исходный код этих приложений, которые они выпускают. много, чтобы учиться оттуда).

Вот сообщение в блоге об этом: http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html

По существу, со стороны приложения: GCM для сигнализации, адаптера синхронизации для сбора данных и правильной работы с Content Provider, который сделает вещи постоянными (да, он изолирует БД от прямого доступа из других частей приложения).

Кроме того, если вы хотите взглянуть на код 2015: https://github.com/google/iosched

Ответ 5

Например, вы хотите синхронизировать таблицу todoTable из MySql в Sqlite

Сначала создайте одну version (type INT) имени столбца version (type INT) в todoTable для Sqlite и MySql enter image description here

Во-вторых, создайте имя таблицы database_version с именем одного столбца currentVersion(INT)
enter image description here

В MySql, когда вы добавляете новый элемент в todoTable или пункт обновления, необходимо обновить версию этого предмета +1, а также обновить currentVersion enter image description here

В Android, когда вы хотите синхронизировать (вручную нажмите кнопку синхронизации или сервис запускается с периодом времени):

Вы отправите запрос с Sqlite (в настоящее время это 1) на сервер.
Затем на сервере вы обнаружите, что элемент в MySql имеет значение версии больше, чем Sqlite (1), а затем ответ на Android (в этом примере элемент 3 с версией 2 будет отвечать на Android)

В SQLite вы добавите или обновите новый элемент в todoTable и обновите currentVersion.

Ответ 6

Посмотрите parseplatform.org. это проект с открытым исходным кодом.

(Так же, как и для коммерческого пакета, доступного по адресу back4app.com.)

Это очень простая и удобная в использовании служба базы данных на стороне сервера, которая дает отличный API-интерфейс для сторонних разработчиков Android.

Ответ 7

Я могу предложить вам Cloudant. Является базой данных как услуга с полной поддержкой синхронизации.

У них есть свободный уровень.

Ответ 8

один из способов добиться этого, чтобы иметь приложение на стороне сервера, которое ждет данных. Данные могут быть отправлены с использованием объектов HttpRequest в Java или вы можете написать свою собственную утилиту передачи данных TCP/IP. Данные могут быть отправлены с использованием формата JSON или любого другого формата, который, по вашему мнению, подходит. Также данные могут быть зашифрованы перед отправкой на сервер, если они содержат конфиденциальную информацию. Все серверное приложение должно просто ждать, пока HttpRequests войдет и проанализирует данные и сохранит их в любом месте.

Ответ 9

Я бы предложил использовать бинарный протокол webservice, похожий на Hessian. Он работает очень хорошо, и у них есть реализация android. Это может быть немного тяжело, но зависит от приложения, которое вы строите. Надеюсь, это поможет.

Ответ 11

@Grantismo дает отличный обзор компонентов синхронизации Android.

Библиотека SyncManagerAndroid обеспечивает простую реализацию двухсторонней синхронизации для подключения к платформе Android Sync (AbstractThreadedSyncAdapter.OnPerformSync).

https://github.com/sschendel/SyncManagerAndroid