Синхронизация данных между приложением Android и веб-сервером
Я хочу синхронизировать данные (например, запись БД, медиа) между приложением Android и сервером. Если вы видели Evernote
или аналогичные приложения, вы, конечно, понимаете, о чем я.
У меня есть вопрос (представьте, что мы хотим синхронизировать записи БД):
Каждый пользователь имеет часть серверного пространства для себя (например,
Evernote
или жеDropbox
). Возможно, пользователь создает новые записи по мобильному телефону и создает новые записи на сервере. Как я могу сопоставить эти записи вместе? Если есть записи с одинаковым идентификатором. Какие алгоритмы вы мне предлагаете?Кроме JSON, есть ли способ передачи данных между мобильным устройством и сервером?
Если SyncAdapter и ContentProvider могут решить мои проблемы, объясните, пожалуйста, именно для меня. (Если бы вы могли предложить мне несколько образцов или учебных пособий ИЛИ любые советы или ключевые слова, которые помогут расширить / направить мой поиск, мы также будем благодарны).
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", чтобы всегда получать самые свежие данные или случайно не записывать поверх вновь записанных данных.
Если мы думаем о сегодняшнем дне, принятый ответ слишком стар. Поскольку мы знаем, что у нас есть много новых библиотек, которые могут помочь вам в создании приложений такого типа.
Вы должны изучить следующие темы, которые вам обязательно помогут:
SyncAdapter: компонент адаптера синхронизации в вашем приложении инкапсулирует код для задач, которые передают данные между устройством и сервером. На основе расписания и триггеров, которые вы предоставляете в своем приложении, платформа адаптера синхронизации запускает код в компоненте адаптера синхронизации.
Realm: Realm - это мобильная база данных: замена SQLite и Core Data.
Модифицированный HTTP-клиент с безопасным типом для Android и Java от Square, Inc. Обязательно изучите умный способ использования для модернизации
И ваша логика синхронизации для базы данных, например: Как синхронизировать базу данных SQLite на телефоне Android с базой данных MySQL на сервере?
Удачи всем новым ученикам.:)
Если вы напишете это сами, вот некоторые моменты, о которых следует помнить
Правильная аутентификация между устройством и сервером синхронизации
Протокол синхронизации между устройством и сервером. Обычно он проходит в 3 этапа: аутентификация, обмен данными, обмен статусами (какие операции работали, а какие - не выполнялись)
Выберите свой формат полезной нагрузки. Я предлагаю XML на основе SyncML в сочетании с форматом на основе JSON для представления фактических данных. Таким образом, SyncML для протокола и JSON для фактических данных, которыми обмениваются. Использование JSON Array при манипулировании данными всегда предпочтительнее, так как к ним легко получить доступ с помощью JSON Array.
Отслеживание изменений данных как на клиенте, так и на сервере. Вы можете вести список изменений идентификаторов, которые меняются, и подбирать их во время сеанса синхронизации. Также очистите журнал изменений, поскольку объекты успешно синхронизированы. Вы также можете использовать логическую переменную для подтверждения статуса синхронизации, т.е. в последний раз синхронизации. Конечным пользователям будет полезно определить время последней синхронизации.
Необходимо иметь способ связи с сервером на устройство, чтобы начать сеанс синхронизации при изменении данных на сервере. Вы можете использовать C2DM или написать свою собственную постоянную коммуникацию на основе TCP. Подход tcp очень прост
Способ репликации изменений данных на нескольких устройствах
И, наконец, что не менее важно, способ выявления и обработки конфликтов
Надеюсь, это поможет в качестве хорошей отправной точки.
@Grantismo дает отличное объяснение в целом. Если вы хотите узнать, кто на самом деле этим занимается, я предлагаю вам взглянуть на то, как Google сделал это для приложения Google IO 2014 года (всегда стоит взглянуть на исходный код этих приложений, которые они выпускают. многому научиться оттуда).
Вот сообщение в блоге об этом: http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html
По существу, на стороне приложения: GCM для сигнализации, Sync Adapter для выборки данных и правильного общения с провайдером контента, который сделает вещи постоянными (да, он изолирует БД от прямого доступа от других частей приложения).
Кроме того, если вы хотите взглянуть на код 2015 года: https://github.com/google/iosched
Например, вы хотите синхронизировать таблицу 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 будет ответом на Android)
В SQLite
, вы добавите или обновите новый элемент todoTable
и обновить текущую версию
Посмотрите на http://parseplatform.org/. это проект с открытым исходным кодом.
(А также вы можете перейти на коммерческий пакет, доступный на https://www.back4app.com/.)
Это очень простой и удобный для пользователя серверный сервис баз данных, который предоставляет отличный клиентский API для Android
Один из способов сделать это - иметь приложение на стороне сервера, которое ожидает данные. Данные могут быть отправлены с помощью HttpRequest
объекты в Java или вы можете написать свой собственный TCP/IP
утилита передачи данных. Данные могут быть отправлены с помощью JSON
формат или любой другой формат, который вы считаете подходящим. Также данные могут быть зашифрованы перед отправкой на сервер, если они содержат конфиденциальную информацию. Все серверное приложение должно просто ждать HttpRequests
войти и проанализировать данные и сохранить их в любом месте.
@Grantismo дает отличный обзор компонентов синхронизации Android.
Библиотека SyncManagerAndroid предоставляет простую реализацию двусторонней синхронизации для подключения к платформе синхронизации Android (AbstractThreadedSyncAdapter.OnPerformSync).
Я бы предложил использовать двоичный протокол веб-сервиса, похожий на Hessian. Это работает очень хорошо, и у них есть реализация Android. Это может быть немного тяжело, но зависит от приложения, которое вы создаете. Надеюсь это поможет.