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



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



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




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


  2. за исключением JSON,есть ли способ для отправки данных между мобильным устройством и сервером?


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


936   9  

9 ответов:

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


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

Постоянного Хранения:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@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

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

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

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

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

во-первых, создайте одно имя столбца 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 currentVersion (в настоящее время это 1) к серверу.
Затем в сервере, вы найдете какой элемент в MySql имеют значение версии больше, чем Sqlite currentVersion (1) затем ответ на Android (в этом примере элемент 3 с версией 2 будет ответ Android)

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

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

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

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

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

https://github.com/sschendel/SyncManagerAndroid

Comments

    Ничего не найдено.