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

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

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

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

  2. Кроме JSON, есть ли способ отправки данных между мобильным телефоном и сервером?

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


person Omid Nazifi    schedule 31.05.2012    source источник
comment
Сначала вам нужно выяснить (решить) ваш протокол связи с сервером - следовательно, какие данные вы можете передавать и как.   -  person hovanessyan    schedule 31.05.2012
comment
Что важно для меня, передайте данные SQLlite. но я бы знал, как передавать другие данные. Я не понимаю, что вы имеете в виду по поводу протокола. пожалуйста, подробнее объясните.   -  person Omid Nazifi    schedule 31.05.2012
comment
Под протоколом я подразумеваю этот simple.wikipedia.org/wiki/Internet_Protocol.   -  person hovanessyan    schedule 31.05.2012
comment
попробуйте konysync, продукт konylabs, который предоставляет комплексные решения для различных платформ (android, windows, ios), веб-серверов, поставщиков данных (salesforce, sap provider), баз данных (sqlserver, mysql...)   -  person saimadan    schedule 05.10.2015


Ответы (9)


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


Для синхронизации данных между вашим веб-сервером и приложением 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», чтобы убедиться, что вы всегда получаете самые свежие данные или случайно не перезаписываете новые данные.

person Grantismo    schedule 07.07.2012
comment
Как быть с большим объемом данных? как я могу синхронизировать? - person Pratik Butani; 05.09.2014
comment
Очень хорошо объяснил, у меня просто есть заметка... SyncAdapter -> выполняет много волшебства. Я надеюсь, вы называете это черной магией... это полное зло. - person MRodrigues; 05.05.2015
comment
@MRodrigues: SyncAdapter может быть черной магией для разработчика, но он по-прежнему творит чудеса со стабильностью и функциональностью, он намного лучше, чем другие библиотеки. - person Milad Metias; 13.12.2015
comment
Что требуется самому веб-сервису для синхронизации с устройством Android? Возможно ли это с помощью Spring? - person jublikon; 18.05.2016

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

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

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

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

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

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

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

person Pratik Butani    schedule 25.04.2016
comment
Ссылка на модификацию умного способа использования не работает - person Greg Holst; 14.01.2019
comment
@GregHolst обновлен. - person Pratik Butani; 18.01.2019
comment
Все еще вниз. Или требует логин? На Archive.org он есть: https://web.archive.org/web/20160316222227/https://futurestud.io/blog/retrofit-getting-started-and-android-client - person bobpaul; 07.02.2019

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

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

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

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

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

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

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

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

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

person openmobster    schedule 31.05.2012

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

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

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

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

person Ciro Costa    schedule 15.05.2015
comment
Исходный код приложения Google IO довольно полезен, IMO! - person Richeek; 11.01.2016

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

Сначала создайте по одному имени столбца version (type INT) в todoTable для Sqlite и MySql введите здесь описание изображения

Во-вторых, создайте имя таблицы database_version с одним именем столбца currentVersion(INT)
введите здесь описание изображения

В MySql при добавлении нового элемента в todoTable или обновлении элемента необходимо обновить версию этого элемента на +1 и также обновить currentVersion введите здесь описание изображения

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

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

В SQLite вы добавите или обновите новый элемент до todoTable и обновите текущую версию.

person Linh    schedule 20.07.2016
comment
Ваша идея блестящая, но вы все еще не можете правильно понять дизайн таблицы. Наряду с остальными службами и правильной службой синхронизации он работает - person Ahesanali Suthar; 01.01.2017

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

(Также вы можете выбрать коммерческий пакет, доступный на back4app.com.)

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

person Kyle    schedule 06.07.2012
comment
Какие бесплатные планы предлагает? - person praxmon; 09.09.2015
comment
http://parse.com/ закрыт. - person Chintan Rathod; 01.02.2016
comment
вы все еще можете использовать функциональность parse.com, но на вашем собственном сервере они имеют открытый исходный код - person geniushkg; 11.02.2016

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

person Mayank    schedule 31.05.2012
comment
Как проверить данные, обновленные в локальном приложении и на сервере? и Как слиться воедино? Нехорошо, что я отправляю все записи в формате JSON или что-то еще в приложение для их слияния. что ты думаешь? - person Omid Nazifi; 31.05.2012
comment
вы можете использовать флаг, например, на сервере с int/bool 1/0 для да или нет. когда запись/файл/блок данных отправляется, проверьте успешность на сервере и переверните бит на «да». затем, если вы используете что-то вроде SQLite, вы можете выполнить тип SELECT * FROM my_table WHERE sent = 0 для отправки любых новых записей - person Evan R.; 18.09.2012

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

person Neo    schedule 07.07.2012

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

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

https://github.com/sschendel/SyncManagerAndroid

person Sean    schedule 26.10.2014