Автономная синхронизация данных в мобильных приложениях AzureOffline Data Sync in Azure Mobile Apps

Что такое автономная синхронизация данных?What is offline data sync?

Автономная синхронизация данных — это функция клиентского и серверного пакета SDK для мобильных приложений Azure, которая упрощает разработчикам создание приложений, предназначенных для работы без подключения к сети.Offline data sync is a client and server SDK feature of Azure Mobile Apps that makes it easy for developers to create apps that are functional without a network connection.

Когда приложение находится в автономном режиме, вы по-прежнему можете создавать и изменять данные, которые будут сохранены в локальном хранилище.When your app is in offline mode, you can still create and modify data, which are saved to a local store. Когда приложение вернется в сеть, оно сможет синхронизировать локальные изменения с серверной частью мобильного приложения Azure.When the app is back online, it can synchronize local changes with your Azure Mobile App backend. Эта функция также поддерживает обнаружение конфликтов при изменении одной и той же записи на клиенте и сервере.The feature also includes support for detecting conflicts when the same record is changed on both the client and the backend. Такие конфликты могут быть обработаны на сервере или клиенте.Conflicts can then be handled either on the server or the client.

Автономная синхронизация имеет несколько преимуществ.Offline sync has several benefits:

  • Повышение скорости реагирования приложений путем локального кэширования данных сервера в устройствеImprove app responsiveness by caching server data locally on the device
  • Создание надежных приложений, которые остаются полезными при проблемах с сетью.Create robust apps that remain useful when there are network issues
  • Предоставление пользователям возможности создания и изменения данных даже в том случае, когда отсутствует сетевой доступ, поддерживая сценарии с минимальной связностью или при отсутствии связности.Allow end users to create and modify data even when there is no network access, supporting scenarios with little or no connectivity
  • Синхронизация данных между несколькими устройствами и обнаружение конфликтов, когда два устройства изменяют одну и ту же записьSync data across multiple devices and detect conflicts when the same record is modified by two devices
  • Ограничение использования сетей с высокой задержкой или лимитным тарифным планом.Limit network use on high-latency or metered networks

В следующих учебниках показано, как добавить автономную синхронизацию в мобильные клиенты с помощью мобильных приложений Azure:The following tutorials show how to add offline sync to your mobile clients using Azure Mobile Apps:

Что такое таблица синхронизации?What is a sync table?

Для доступа к конечной точке /tables клиентские пакеты SDK для мобильных приложений Azure предоставляют интерфейсы, такие как IMobileServiceTable (пакет SDK для клиента .NET) или MSTable (клиент iOS).To access the "/tables" endpoint, the Azure Mobile client SDKs provide interfaces such as IMobileServiceTable (.NET client SDK) or MSTable (iOS client). Эти API подключаются непосредственно к серверной части мобильного приложения Azure и выдают ошибку, если у клиентского устройства нет сетевого подключения.These APIs connect directly to the Azure Mobile App backend and fail if the client device does not have a network connection.

Для поддержки автономной работы в приложении следует использовать интерфейсы API таблицы синхронизации, такие как IMobileServiceSyncTable (пакет SDK для клиента .NET) или MSSyncTable (клиент iOS).To support offline use, your app should instead use the sync table APIs, such as IMobileServiceSyncTable (.NET client SDK) or MSSyncTable (iOS client). Все те же операции CRUD (Create, Read, Update, Delete — создание, чтение, обновление и удаление) работают с API таблицы синхронизации, за исключением того, что теперь чтение и запись осуществляются в локальном хранилище.All the same CRUD operations (Create, Read, Update, Delete) work against sync table APIs, except now they read from or write to a local store. Прежде чем можно будет выполнить операции с таблицей синхронизации, необходимо инициализировать локальное хранилище.Before any sync table operations can be performed, the local store must be initialized.

Что такое локальное хранилище?What is a local store?

Локальное хранилище — это уровень сохраняемости данных на клиентском устройстве.A local store is the data persistence layer on the client device. Клиентские пакеты SDK для мобильных приложений Azure предоставляют реализацию локального хранилища по умолчанию.The Azure Mobile Apps client SDKs provide a default local store implementation. В Windows, Xamarin и Android она основана на SQLite.On Windows, Xamarin and Android, it is based on SQLite. В IOS реализация основана на Core Data.On iOS, it is based on Core Data.

Чтобы использовать реализацию на основе SQLite для Windows Phone или Microsoft Store, необходимо установить расширение SQLite.To use the SQLite-based implementation on Windows Phone or Microsoft Store, you need to install a SQLite extension. Дополнительные сведения см. в разделе Включение автономной синхронизации для приложения для Windows. Android и iOS поставляются с версией SQLite в самой операционной системе устройства, поэтому нет необходимости ссылаться на собственную версию SQLite.For more information, see Universal Windows Platform: Enable offline sync. Android and iOS ship with a version of SQLite in the device operating system itself, so it is not necessary to reference your own version of SQLite.

Разработчики также могут реализовать собственное локальное хранилище.Developers can also implement their own local store. Например, если вы хотите хранить данные в зашифрованном виде в мобильном клиенте, можно определить локальное хранилище, которое для шифрования использует SQLCipher.For instance, if you wish to store data in an encrypted format on the mobile client, you can define a local store that uses SQLCipher for encryption.

Что такое контекст синхронизации?What is a sync context?

Контекст синхронизации связан с объектом мобильного клиента (таким как IMobileServiceClient или MSClient) и отслеживает изменения, внесенные с помощью таблиц синхронизации.A sync context is associated with a mobile client object (such as IMobileServiceClient or MSClient) and tracks changes that are made with sync tables. Контекст синхронизации обеспечивает очередь операций, содержащую упорядоченный список операций CUD (Create, Update, Delete — создание, обновление, удаление), который позднее будет отправлен на сервер.The sync context maintains an operation queue, which keeps an ordered list of CUD operations (Create, Update, Delete) that is later sent to the server.

Локальное хранилище связано с контекстом синхронизации посредством метода инициализации, например IMobileServicesSyncContext.InitializeAsync(localstore) , в клиентском пакете SDK для .NET.A local store is associated with the sync context using an initialize method such as IMobileServicesSyncContext.InitializeAsync(localstore) in the .NET client SDK.

Как работает автономная синхронизацияHow offline synchronization works

При использовании таблиц синхронизации код клиента определяет, когда локальные изменения будут синхронизированы с серверной частью мобильного приложения Azure.When using sync tables, your client code controls when local changes are synchronized with an Azure Mobile App backend. Ничего не отправляется в серверную часть, пока не осуществляется вызов отправки локальных изменений.Nothing is sent to the backend until there is a call to push local changes. Аналогично, локальное хранилище заполняется новыми данными только в том случае, если осуществляется вызов извлечения .Similarly, the local store is populated with new data only when there is a call to pull data.

  • Отправка: представляет собой операцию в контексте синхронизации и передает все изменения, внесенные операциями CUD с момента последней отправки.Push: Push is an operation on the sync context and sends all CUD changes since the last push. Обратите внимание, что нельзя передать только изменения в отдельной таблице, так как в противном случае операции могут быть отправлены не по порядку.Note that it is not possible to send only an individual table's changes, because otherwise operations could be sent out of order. Операция отправки выполняет серию вызовов REST к серверной части мобильного приложения Azure, которая, в свою очередь, изменяет сервер базы данных.Push executes a series of REST calls to your Azure Mobile App backend, which in turn modifies your server database.

  • Извлечение: выполняется отдельно для каждой таблицы и может настраиваться с помощью запроса для получения подмножества данных сервера.Pull: Pull is performed on a per-table basis and can be customized with a query to retrieve only a subset of the server data. Клиентские пакеты SDK для мобильных приложений Azure вставляют результирующие данные в локальное хранилище.The Azure Mobile client SDKs then insert the resulting data into the local store.

  • Неявные отправки: если для таблицы с ожидающими локальными обновлениями выполняется извлечение, то сначала будет выполнена операция push() в контексте синхронизации.Implicit Pushes: If a pull is executed against a table that has pending local updates, the pull first executes a push() on the sync context. Это позволяет свести к минимуму конфликты между изменениями, которые уже поставлены в очередь, и новыми данными с сервера.This push helps minimize conflicts between changes that are already queued and new data from the server.

  • Добавочная синхронизация: первый параметр операции извлечения — имя запроса , которое используется только на стороне клиента.Incremental Sync: the first parameter to the pull operation is a query name that is used only on the client. При использовании имени запроса, отличного от NULL, пакет SDK для мобильных приложений Azure выполняет добавочную синхронизацию. Каждый раз, когда операция извлечения возвращает набор результатов, последняя updatedAt метка времени из этого результирующего набора хранится в локальных системных таблицах SDK.If you use a non-null query name, the Azure Mobile SDK performs an incremental sync. Each time a pull operation returns a set of results, the latest updatedAt timestamp from that result set is stored in the SDK local system tables. Последующие операции извлечения будут получать только записи после этой метки времени.Subsequent pull operations retrieve only records after that timestamp.

    Для использования добавочной синхронизации ваш сервер должен возвращать осмысленные значения updatedAt, а также поддерживать сортировку по этому полю.To use incremental sync, your server must return meaningful updatedAt values and must also support sorting by this field. Но так как пакет SDK добавляет собственную сортировку по полю updatedAt, нельзя использовать запрос на извлечение, в котором есть собственное предложение orderBy .However, since the SDK adds its own sort on the updatedAt field, you cannot use a pull query that has its own orderBy clause.

    Именем запроса может быть любая строка на ваш выбор, но оно должно быть уникальным для каждого логического запроса в приложении.The query name can be any string you choose, but it must be unique for each logical query in your app. В противном случае разные операции извлечения могут перезаписать одну и ту же метку времени добавочной синхронизации, и запросы могут возвращать неправильные результаты.Otherwise, different pull operations could overwrite the same incremental sync timestamp and your queries can return incorrect results.

    Если в запросе есть параметр, один из способов создать уникальное имя запроса — включить в него значение параметра.If the query has a parameter, one way to create a unique query name is to incorporate the parameter value. Например, при фильтрации по userid имя запроса может быть следующим (в C#):For instance, if you are filtering on userid, your query name could be as follows (in C#):

      await todoTable.PullAsync("todoItems" + userid,
          syncTable.Where(u => u.UserId == userid));
    

    Если вы хотите явно отказаться от добавочной синхронизации, передайте null в качестве идентификатора запроса.If you want to opt out of incremental sync, pass null as the query ID. В этом случае при каждом вызове PullAsync извлекаются все записи, что может снижать уровень производительности.In this case, all records are retrieved on every call to PullAsync, which is potentially inefficient.

  • Очистка: можно очистить локальное хранилище с помощью IMobileServiceSyncTable.PurgeAsync.Purging: You can clear the contents of the local store using IMobileServiceSyncTable.PurgeAsync. Это может потребоваться, если в базе данных клиента есть устаревшие данные или вы хотите отменить все ожидающие изменения.Purging may be necessary if you have stale data in the client database, or if you wish to discard all pending changes.

    Данная операция очищает таблицу в локальном хранилище.A purge clears a table from the local store. При наличии операций, ожидающих синхронизации с базой данных сервера, очистка породит исключение, если только не задан параметр force purge.If there are operations awaiting synchronization with the server database, the purge throws an exception unless the force purge parameter is set.

    Пример устаревших данных на клиенте: предположим, что в примере «todo list» устройство Device1 извлекает только элементы, которые не завершены.As an example of stale data on the client, suppose in the "todo list" example, Device1 only pulls items that are not completed. Элемент Todoitem "Купить молоко" помечается на сервере как завершенный другим устройством.A todoitem "Buy milk" is marked completed on the server by another device. Однако устройство Device1 по-прежнему хранит элемент Todoitem "Купить молоко" в локальном хранилище, так как оно извлекает только элементы, которые не помечены как завершенные.However, Device1 still has the "Buy milk" todoitem in local store because it is only pulling items that are not marked complete. Очистка позволяет удалить этот устаревший элемент.A purge clears this stale item.

Следующие шагиNext steps