Синхронізувати дані між додатком Android та веб-сервером [закрито]


262

Я хочу синхронізувати дані (наприклад, db-запис, медіа) між додатком 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, sop провайдери), бази даних (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", щоб переконатися, що ви завжди отримуєте найсвіжіші дані або випадково не пишете нещодавно записані дані.


3
А як щодо великої кількості даних? як я можу синхронізувати?
Пратік Бутані

4
Дуже добре пояснено, у мене просто примітка ... SyncAdapter -> "виконай багато магії". Я сподіваюся, ви називаєте це чорною магією ... це абсолютно зло.
MRodrigues

@MRodrigues: SyncAdapter може бути чорною магією для розробника, але він все ще робить магію для стабільності та функціональності, це набагато краще, ніж інші
ліб

2
Що потрібно самому веб-сервісу, щоб синхронізувати його з пристроєм Android? Чи можливо це з Весною?
jublikon

58

Якщо ми думаємо про сьогодні , прийнята відповідь занадто стара. Як ми знаємо, у нас є багато нових бібліотек, які можуть допомогти вам зробити такі типи додатків.

Ви повинні вивчити наступні теми, які вам точно допоможуть:

  • SyncAdapter: Компонент адаптера синхронізації у вашому додатку інкапсулює код для завдань, які передають дані між пристроєм та сервером. На основі планування та тригерів, які ви надаєте у своїй програмі, рамка адаптера синхронізації запускає код у компоненті адаптера синхронізації.

  • Realm : Realm - це мобільна база даних: заміна SQLite & Core Data.

  • Retrofit -безпечний HTTP-клієнт для Android та Java від Square, Inc. Повинен навчитися розумному способу використання-модернізації

І ваша логіка синхронізації для бази даних на кшталт: Як синхронізувати базу даних SQLite на телефоні Android з базою даних MySQL на сервері?

Найкраща удача для всіх нових учнів. :)


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

@GregHolst оновлено.
Пратік Бутані

3
Ще вниз. Або потрібен логін? У Archive.org є: web.archive.org/web/20160316222227/https://futurestud.io/blog/…
bobpaul

24

Якщо ви пишете це самостійно, це деякі з моментів, які слід пам’ятати

Правильна автентифікація між пристроєм та сервером синхронізації

Протокол синхронізації між пристроєм та сервером. Зазвичай це триватиме три фази, аутентифікація, обмін даними, обмін статусом (які операції працювали, а які не вдалися)

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

Відстеження змін даних як на клієнті, так і на сервері. Ви можете підтримувати журнал змін, які змінюються, та підбирати їх під час сеансу синхронізації. Також очистіть журнал змін, оскільки об'єкти успішно синхронізовані. Ви також можете використовувати булеву змінну для підтвердження стану синхронізації, тобто останнього часу синхронізації. Кінцевим користувачам буде корисно визначити час останньої синхронізації.

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

Спосіб копіювання змін даних на декількох пристроях

І останнє, але не в останню чергу, спосіб виявлення та вирішення конфліктів

Сподіваюся, це допомагає як хороший вихідний пункт.


14

@Grantismo надає чудове пояснення в цілому. Якщо ви хочете знати, хто насправді цим займається, я пропоную вам поглянути на те, як Google зробив для Google IO App 2014 року (завжди варто глибоко ознайомитись із вихідним кодом цих програм, які вони випускають. багато чому навчитися звідти).

Ось повідомлення про це в блозі: http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html

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

Також, якщо ви хочете переглянути код 2015 року: https://github.com/google/iosched


Вихідний код для додатка Google IO - дуже корисний IMO!
Рішек,

10

Наприклад, ви хочете синхронізувати таблицю todoTableз MySqlдоSqlite

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

По-друге, створіть ім’я таблиці database_versionз одним ім'ям стовпцяcurrentVersion(INT)
введіть тут опис зображення

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

У разі Android, коли ви хочете синхронізувати (натискаючи кнопку синхронізації вручну або запустити послугу з періодом часу):

Ви надішлете запит із Sqliteсервером currentVersion (зараз це 1) на сервер.
Потім на сервері ви знайдете, який елемент у MySqlзначенні версії перевищує SqliteпоточнийVersion (1), а потім відповідь на Android (у цьому прикладі пункт 3 із версією 2 відповість на Android)

В SQLite, ви будете додавати або оновлювати новий елемент до todoTableта оновити currentVersion


1
Ваша ідея геніальна, але все ще не може правильно зрозуміти дизайн столу. Поряд із послугами відпочинку та належним сервісом синхронізації він працює
Ahesanali Suthar

6

Подивіться на parseplatform.org . це проект із відкритим кодом.

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

Це дуже простий вперед та зручний сервіс бази даних сервера, який надає чудовий API для клієнтів Android


Які безкоштовні плани пропонує ця пропозиція?
Прахар Мохан Срівастава


4
ви все ще можете використовувати функцію parse.com, але на власному сервері вони
відкрилися

3

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


Як перевірити оновлені дані в локальному додатку та сервері? і Як злитися разом? Непогано, що я надсилаю всі записи JSON або будь-які інші запити до заявки на об'єднання їх. що ти думаєш?
Омід-нацифі

2
ви можете використовувати прапор, наприклад "на сервері" з int / bool 1/0, так або ні. коли запис / файл / блок даних надсилається, перевірте успішність на сервері та переверніть біт так. то якщо ви використовуєте щось на зразок SQLite, ви можете зробити "ВИБРАТИ * ВІД my_table WHERE послано = 0", щоб надіслати будь-які нові записи
Еван Р.

1

Я б запропонував використовувати бінарний протокол веб-сервісу, подібний до Гессіана . Це працює дуже добре, і вони мають андроїд реалізацію. Це може бути трохи важким, але це залежить від програми, яку ви будуєте. Сподіваюсь, це допомагає.


1

@Grantismo дає чудовий огляд компонентів синхронізації Android.

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

https://github.com/sschendel/SyncManagerAndroid

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.