Разработка мобильных приложений с Dropbox Datastore API

в 12:21, , рубрики: datastore api, DropBox, James Clancey, mobile development, Steve Marx, xamarin, Блог компании Touch Instinct, разработка под iOS

У Dropbox есть три API для мобильных приложений:

  • Drop-ins два простых UI компонента: Chooser для выбора файла из Dropbox-директорий пользователя и Saver для сохранения файлов в Dropbox. Никакой настройки, аутентификации. Вызываете компонент, взамен получаете ссылку на файл. Под iOS и Android доступен только Chooser, Saver появится позже.
  • Core API самый низкоуровневый API. Он позволяет читать и записывать файлы и директории на сервере Dropbox. Авторы называют API — RESTish. То есть он использует HTTP, читаемые URL, JSON ответы, но не следует REST принципам досконально. Для аутентификации используется OAuth 2.0.
  • Sync API работает поверх Core API и выглядит как доступ к файловой системе. Директории и файлы доступны даже без доступа к интернету и синхронизируются автоматически с серверами Dropbox. Самое удобное API для разработки мобильных приложений.

Sync API хорош, но по статистике, многие мобильные разработчики используют его для хранения структурированных данных. Сериализуют их в JSON, сохраняют в файлы, синхронизируют с облаком. Это работает до тех пор, пока не происходит одновременного изменения данных с разных устройств. Даже если вы поменяете не конфликтующие по смыслу данные, на уровне файла это будет конфликт и Dropbox не сможет его решить.

Поэтому мы выпустили Datastore API. Он синхронизируем не файлы, а данные, чем-то похож на удаленную NoSQL базу данных с кешированием.

Разработка мобильных приложений с Dropbox Datastore API

Например, у вас есть SQLite база данных. Она синхронизируется с облаком при помощи Dropbox Core API. Если поменять значения в разных строках таблицы на разных устройствах, мы получим конфликт синхронизации файла. Хотя изменения на уровне данных не конфликтуют с друг другом. Datastore API решает эту проблему.

Модель данных

В DataStore используется не реляционная модель данных, а что-то похожее на NoSQL. У каждого Dropbox пользователя есть хранилище, хранилище содержит в себе таблицы. Таблицы делятся на записи у каждой записи есть поля со значениями. Записи в таблице могут иметь разный набор полей, то есть фактически это не таблица, нет строк и столбцов, нет жесткой структуры.

Разработка мобильных приложений с Dropbox Datastore API

Синхронизация

Магия начинается после вызова метода sync. В iOS и Android sync вызывается после завершения осмысленной последовательности изменения данных. Можно сравнить с коммитом в системах контроля версий.

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

Разрешение конфликтов

Мы уделили много внимания разрешению конфликтов. Конфликт происходит когда два устройства одновременно обновляют одно и то же хранилище. Например, два устройства теряют доступ к интернету. Локально сохранена ревизия 1 хранилища. Оба устройства меняют данные в хранилище. При появлении интернета и синхронизации устройств с сервером мы получим две разные версии ревизии 2, это и есть конфликт.

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

При применении этих правил сервером вы получите ошибку синхронизации с подробностями об изменениях и можете программно объединить данные и послать их на сервер еще раз.

По умолчанию работает правило «выигрывает сервер». Если приложение пытается отправить изменение поля на сервер, которое уже было изменено, остается версия сервера, значение поля пришедшее с устройства выбрасывается. Например, у меня нет доступа к сети и я на своем смартфоне меняю номер телефона Маши на 911. Тем временем моя секретарша, с доступом к интернету, меняет номер Маши на 112. Когда мой смартфон выйдет в онлайн, мои изменения номера будут отброшены. Номером Маши будет 112.

Можно поменять правило по умолчанию на «выигрывает клиент», все изменения сервера будут отброшены и номером Маши будет 911. Что достаточно странно, поэтому «выигрывает сервер» правило по умолчанию.

Для числовых значений дополнительно есть правила «минимума», «максимума» и «суммы». То есть в конфликтной ситуации будет выбрано минимальное или максимальное значение. «Максимум» удобен для значений которые не должны уменьшаться, например инкрементальных счетчиков.

В правиле «суммы» результатом разрешения конфликта будет сумма изменений значения. Звучит странно, но работает, например, для счетчика нажатий на кнопку в приложении. Пользователь одновременно нажимает ее с двух разных устройств, сервер суммирует результат. Два устройства синхронизируются с сервером, в поле было 3. Одно устройство поменяло его на 4, другое на 5. Результатом синхронизации поля будет 6.

Для разрешения конфликтов в списках мы используем Операциональное преобразование (Operational Transformation). Оно так же используется в Google Wave и Google Docs.

Например, у нас есть список ACZ. На одном устройстве вставляем B на вторую позицию и одновременно вставляем Z с другого устройства на третью. Результат должен быть ABCXZ, а не ABXCZ. Звучит просто, но реализация потребовала применения хитрых алгоритмов.

Проектированием хранилища и разрешением конфликтов занимается Гвидо Ван Россум (создатель языка Python, сейчас работает в Dropbox). Он написал подробный технический пост о том как это происходит.

Dropbox API в Xamarin приложениях

Официальный компонент Dropbox API есть в магазине компонентов Xamarin.

Подробный шаг-за-шагом пример разработки приложения с Datastore API в блоге Xamarin.

прим. пер. По-моему, новый API от дропбокса очень кстати. При разработке Coin Keeper мы очень много времени потратили на придумывание и реализацию синхронизации приложения с сервером. Потом еще два месяца исправляли ошибки. С Datastore API все было бы гораздо проще. С другой стороны, все достоинства перечеркиваются требованием Dropbox-аккаунта от пользователя.

А вы бы стали использовать Datastore API в своем приложении?


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

Автор: junk

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js