Я хочу синхронизировать данные (например, запись БД, медиа) между приложением Android и сервером. Если вы видели Evernote
или похожие приложения, вы, безусловно, понимаете, что я имею в виду.
У меня есть вопрос (представьте, что мы хотим синхронизировать записи БД):
Каждый пользователь имеет часть серверного пространства для себя (например,
Evernote
илиDropbox
). Возможно, пользователь создает новые записи по мобильному телефону и создает новые записи на сервере. Как я могу сопоставить эти записи вместе? Если есть записи с одинаковым идентификатором. Какие алгоритмы вы мне предлагаете?Кроме JSON , есть ли способ передачи данных между мобильным устройством и сервером?
Если SyncAdapter и ContentProvider может решить свои проблемы, пожалуйста , объясните , как раз для меня. (Если бы вы могли предложить мне несколько образцов или учебных пособий ИЛИ любые советы или ключевые слова, которые помогут расширить / направить мой поиск, мы также будем благодарны).
источник
Ответы:
Я постараюсь ответить на все ваши вопросы, ответив на более широкий вопрос: как я могу синхронизировать данные между веб-сервером и приложением для 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
текущей версией (в настоящее время она равна 1) на сервер.Затем на сервере вы обнаружите, что элемент
MySql
имеет значение версии больше, чемSqlite
currentVersion (1), а затем ответ Android (в этом примере элемент 3 с версией 2 будет отвечать Android).В
SQLite
, вы добавите или обновите новый элементtodoTable
и обновите currentVersion.источник
Посмотрите на parseplatform.org . это проект с открытым исходным кодом.
(А также вы можете перейти на коммерческий пакет, доступный на back4app.com .)
Это очень простой и удобный для пользователя серверный сервис баз данных, который предоставляет отличный клиентский API для Android
источник
Один из способов сделать это - приложение на стороне сервера, которое ожидает данные. Данные могут быть отправлены с использованием
HttpRequest
объектов в Java или вы можете написать свою собственнуюTCP/IP
утилиту передачи данных. Данные могут быть отправлены с использованиемJSON
формата или любого другого формата, который вы считаете подходящим. Также данные могут быть зашифрованы перед отправкой на сервер, если они содержат конфиденциальную информацию. Все, что нужно приложению Сервера, - это просто подождать,HttpRequests
чтобы войти, проанализировать данные и сохранить их в любом месте.источник
Я бы предложил использовать двоичный протокол веб-сервиса, похожий на Hessian . Это работает очень хорошо, и у них есть реализация Android. Это может быть немного тяжело, но зависит от приложения, которое вы создаете. Надеюсь это поможет.
источник
@Grantismo дает отличный обзор компонентов синхронизации Android.
Библиотека SyncManagerAndroid предоставляет простую реализацию двусторонней синхронизации для подключения к платформе синхронизации Android (AbstractThreadedSyncAdapter.OnPerformSync).
https://github.com/sschendel/SyncManagerAndroid
источник