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

262

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

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

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

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

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

Омид Назифи
источник
1
Сначала вам нужно выяснить (принять решение) о вашем протоколе связи с сервером, а значит, какие данные вы можете передавать и как.
Ованесян
Это важно для меня, перенести данные SQLlite. но я бы знал, как передавать другие данные. Я не понимаю, что вы имеете в виду о протоколе. пожалуйста, подробнее объясните.
Омид Назифи
Под протоколом я подразумеваю это simple.wikipedia.org/wiki/Internet_Protocol
hovanessyan
1
попробуйте konysync, продукт konylabs, который предоставляет комплексные решения для различных платформ (Android, Windows, IOS), веб-серверов, поставщиков данных (salesforce, sap провайдеров), баз данных (sqlserver, mysql ...)
Saimadan

Ответы:

311

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

Grantismo
источник
3
Как насчет большого количества данных? как я могу синхронизировать?
Пратик Бутани
4
Очень хорошо объяснил, у меня просто есть заметка ... SyncAdapter -> "выполнять много магии". Я надеюсь, что вы называете это черной магией ... это абсолютно зло.
MRodrigues
@MRodrigues: SyncAdapter мог бы быть черной магией для разработчика, но он все еще делает волшебство для стабильности и функциональности, он намного лучше, чем другие библиотеки
Milad Metias
2
Что сам веб-сервис требует для синхронизации с устройством Android? С весной это возможно?
Юбликон
58

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

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

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

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

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

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

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

Пратик Бутани
источник
Ссылка на «умный способ использования модернизации»
Грег Холст
@GregHolst обновлен.
Пратик Бутани
3
Все еще внизу. Или требуется логин? Archive.org это есть: web.archive.org/web/20160316222227/https://futurestud.io/blog/...
bobpaul
24

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

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

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

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

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

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

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

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

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

openmobster
источник
14

@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

Чиро Коста
источник
Исходный код приложения Google IO довольно полезен для IMO!
Richeek
10

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

Во- первых, создать одно имя столбца version (type INT)в todoTableдля обоих SqliteиMySql введите описание изображения здесь

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

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

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

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

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

Фан Ван Линь
источник
1
Ваша идея блестящая, но все еще не может правильно понять дизайн стола. Наряду со службами отдыха и надлежащей службой синхронизации это работает
Ahesanali Suthar
6

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

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

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

рукав моря
источник
Какие бесплатные планы это предложение?
Прахар Мохан Шривастава
12
http://parse.com/ выключен.
Чинтан Ратод
4
вы все еще можете использовать функциональность parse.com, но на вашем собственном сервере они
открыты
3

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

Mayank
источник
Как проверить данные, обновленные в локальном приложении и на сервере? и как слить вместе? Это не хорошо, что я отправляю все записи JSON или что-то еще в приложение для их слияния. что ты думаешь?
Омид Назифи
2
Вы можете использовать флаг, например, «на сервере» с int / bool 1/0 для «да» или «нет». когда будет отправлена ​​запись / файл / блок данных, проверьте успешность на сервере и переключите бит на да. затем, если вы используете что-то вроде SQLite, вы можете сделать что-то типа «SELECT * FROM my_table WHERE sent = 0» для отправки любых новых записей
Эван Р.
1

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

Нео
источник
1

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

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

https://github.com/sschendel/SyncManagerAndroid

Шон
источник