Синхронизация автономных данных с мобильными приложениями AzureSynchronizing Offline Data with Azure Mobile Apps

Загрузить образец загрузить примерDownload Sample Download the sample

Автономная синхронизация позволяет пользователям взаимодействовать с мобильными приложениями, просмотр, добавление или изменение данных, даже в том случае, где нет сетевого подключения. Изменения сохраняются в локальной базе данных, а когда устройство подключено к сети, изменения можно синхронизировать с экземпляром мобильных приложений Azure. В этой статье объясняется, как добавить функцию автономной синхронизации для приложения Xamarin.Forms.Offline sync allows users to interact with a mobile application, viewing, adding, or modifying data, even where there isn't a network connection. Changes are stored in a local database, and once the device is online, the changes can be synced with the Azure Mobile Apps instance. This article explains how to add offline sync functionality to a Xamarin.Forms application.

ОбзорOverview

Пакета SDK Azure Mobile Client предоставляет IMobileServiceTable интерфейс, который представляет операции, которые могут выполняться для таблиц, сохраненных в экземпляре мобильных приложений Azure.The Azure Mobile Client SDK provides the IMobileServiceTable interface, which represents the operations that can be performed on tables stored in the Azure Mobile Apps instance. Эти операции напрямую подключаться к экземпляру мобильных приложений Azure и завершится ошибкой, если мобильное устройство не имеет сетевого подключения.These operations connect directly to the Azure Mobile Apps instance and will fail if the mobile device doesn't have a network connection.

Для поддержки автономной синхронизации, пакета SDK Azure Mobile Client поддерживает синхронизировать таблицы, которые предоставляются элементом IMobileServiceSyncTable интерфейс.To support offline sync, the Azure Mobile Client SDK supports sync tables, which are provided by the IMobileServiceSyncTable interface. Этот интерфейс обеспечивает же создания, чтения, обновления и удаления (CRUD) операции, как IMobileServiceTable интерфейс, но операций чтения или записи в локальном хранилище.This interface provides the same Create, Read, Update, Delete (CRUD) operations as the IMobileServiceTable interface, but the operations read from or write to a local store. Локальное хранилище не заполняется новыми данными из экземпляра мобильных приложений Azure до вызова по запросу данных.The local store isn't populated with new data from the Azure Mobile Apps instance until there is a call to pull data. Аналогичным образом, данные не передаются экземпляру мобильных приложений Azure до вызова принудительной локальные изменения.Similarly, data isn't sent to the Azure Mobile Apps instance until there is a call to push local changes.

Автономная синхронизация также включает поддержку обнаружения конфликтов при изменении одной записи в локальном хранилище и в экземпляре мобильных приложений Azure, а пользовательское разрешение конфликтов.Offline sync also includes support for detecting conflicts when the same record has changed in both the local store and in the Azure Mobile Apps instance, and custom conflict resolution. Конфликты могут быть обработаны, либо в локальном хранилище или в экземпляре мобильных приложений Azure.Conflicts can either be handled in the local store, or in the Azure Mobile Apps instance.

Дополнительные сведения об автономной синхронизации см. в разделе автономной синхронизации данных в мобильных приложениях Azure и Включение автономной синхронизации для мобильного приложения Xamarin.Forms.For more information about offline sync, see Offline Data Sync in Azure Mobile Apps and Enable offline sync for your Xamarin.Forms mobile app.

УстановкаSetup

Процесс интеграции автономной синхронизации между приложения Xamarin.Forms и экземпляром мобильных приложений Azure выглядит следующим образом:The process for integrating offline sync between a Xamarin.Forms application and an Azure Mobile Apps instance is as follows:

  1. Создайте экземпляр мобильных приложений Azure.Create an Azure Mobile Apps instance. Дополнительные сведения см. в разделе использование мобильное приложение Azure.For more information, see Consuming an Azure Mobile App.
  2. Добавить Microsoft.Azure.Mobile.Client.SQLiteStore пакет NuGet для всех проектов в решение Xamarin.Forms.Add the Microsoft.Azure.Mobile.Client.SQLiteStore NuGet package to all projects in the Xamarin.Forms solution.
  3. (Необязательно) Включите проверку подлинности в экземпляра мобильных приложений Azure и приложения Xamarin.Forms.(Optional) Enable authentication in the Azure Mobile Apps instance and the Xamarin.Forms application. Дополнительные сведения см. в разделе проверки подлинности пользователей с помощью мобильных приложений Azure.For more information, see Authenticating Users with Azure Mobile Apps.

Следующий раздел содержит дополнительные инструкции по настройке проектов универсальной платформы Windows (UWP) для использования пакета Microsoft.Azure.Mobile.Client.SQLiteStore NuGet.The following section provides additional setup instructions for configuring Universal Windows Platform (UWP) projects to use the Microsoft.Azure.Mobile.Client.SQLiteStore NuGet package. Дополнительные настройки не обязательно использовать пакет Microsoft.Azure.Mobile.Client.SQLiteStore NuGet в iOS и Android.No additional setup is required to use the Microsoft.Azure.Mobile.Client.SQLiteStore NuGet package on iOS and Android.

Универсальная платформа Windows Universal Windows Platform

Чтобы использовать SQLite для универсальной платформы Windows (UWP), выполните следующие действия.To use SQLite on the Universal Windows Platform (UWP), follow these steps:

  1. Установка SQLite для универсальной платформы Windows расширение Visual Studio в среде разработки.Install the SQLite for the Universal Windows Platform Visual Studio Extension in your development environment.
  2. В проекте UWP в Visual Studio, щелкните правой кнопкой мыши ссылки > Добавить ссылку, перейдите к расширения и добавьте SQLite для универсальной платформы Windows и Среда выполнения 2015 Visual C++ для приложений универсальной платформы Windows расширение для проекта универсальной платформы Windows.In the UWP project in Visual Studio, right click References > Add Reference, navigate to Extensions and add the SQLite for Universal Windows Platform and Visual C++ 2015 Runtime for Universal Windows Platform Apps extensions to the UWP project.

Инициализация Local StoreInitializing the Local Store

Необходимо инициализировать локальное хранилище, чтобы можно было выполнять операции с таблицей синхронизации.The local store must be initialized before any sync table operations can be performed. Для этого в проекте переносимой библиотеки классов (PCL) Xamarin.Forms решения:This is achieved in the Portable Class Library (PCL) project of the Xamarin.Forms solution:

using Microsoft.WindowsAzure.MobileServices;
using Microsoft.WindowsAzure.MobileServices.SQLiteStore;
using Microsoft.WindowsAzure.MobileServices.Sync;

namespace TodoAzure
{
    public partial class TodoItemManager
    {
        static TodoItemManager defaultInstance = new TodoItemManager();
        IMobileServiceClient client;
        IMobileServiceSyncTable<TodoItem> todoTable;

        private TodoItemManager()
        {
            this.client = new MobileServiceClient(Constants.ApplicationURL);
            var store = new MobileServiceSQLiteStore("localstore.db");
            store.DefineTable<TodoItem>();
            this.client.SyncContext.InitializeAsync(store);
            this.todoTable = client.GetSyncTable<TodoItem>();
        }
        ...
  }
}

Созданный новый локальной базы данных SQLite MobileServiceSQLiteStore класса, при условии, что он еще не существует.A new local SQLite database is created by the MobileServiceSQLiteStore class, provided that it doesn't already exist. Затем DefineTable<T> метод создает таблицу в локальном хранилище, соответствующую полям в TodoItem введите, при условии, что он еще не существует.Then, the DefineTable<T> method creates a table in the local store that matches the fields in the TodoItem type, provided that it doesn't already exist.

Объект контекст синхронизации связан с MobileServiceClient экземпляра и отслеживает изменения, внесенные с помощью таблиц синхронизации.A sync context is associated with a MobileServiceClient instance, and tracks changes that are made with sync tables. Контекст синхронизации обеспечивает, что очередь, которая отслеживает упорядоченный список операций создания, обновления и удаления (CUD), который будет отправлен к экземпляру мобильных приложений Azure позже.The sync context maintains a queue that keeps an ordered list of Create, Update, and Delete (CUD) operations that will be sent to the Azure Mobile Apps instance later. IMobileServiceSyncContext.InitializeAsync() Метод используется для связывания с контекстом синхронизации локального хранилища.The IMobileServiceSyncContext.InitializeAsync() method is used to associate the local store with the sync context.

todoTable Поле является IMobileServiceSyncTable, и поэтому все операции CRUD использовать локальное хранилище.The todoTable field is an IMobileServiceSyncTable, and so all CRUD operations use the local store.

Выполнение синхронизацииPerforming Synchronization

Локальное хранилище синхронизируется с Azure Mobile Apps экземпляром при SyncAsync вызывается метод:The local store is synchronized with the Azure Mobile Apps instance when the SyncAsync method is invoked:

public async Task SyncAsync()
{
  ReadOnlyCollection<MobileServiceTableOperationError> syncErrors = null;

  try
  {
    await this.client.SyncContext.PushAsync();

    // The first parameter is a query name that is used internally by the client SDK to implement incremental sync.
    // Use a different query name for each unique query in your program.
    await this.todoTable.PullAsync("allTodoItems", this.todoTable.CreateQuery());
  }
  catch (MobileServicePushFailedException exc)
  {
    if (exc.PushResult != null)
    {
      syncErrors = exc.PushResult.Errors;
    }
  }

  // Simple error/conflict handling.
  if (syncErrors != null)
  {
    foreach (var error in syncErrors)
    {
      if (error.OperationKind == MobileServiceTableOperationKind.Update && error.Result != null)
      {
        // Update failed, revert to server's copy
        await error.CancelAndUpdateItemAsync(error.Result);
      }
      else
      {
        // Discard local change
        await error.CancelAndDiscardItemAsync();
      }

      Debug.WriteLine(@"Error executing sync operation. Item: {0} ({1}). Operation discarded.", error.TableName, error.Item["id"]);
    }
  }
}

IMobileServiceSyncTable.PushAsync Метод работает на контекст синхронизации, а не конкретной таблицы, а также отправляет все изменения CUD с момента последней отправки.The IMobileServiceSyncTable.PushAsync method operates on the sync context, rather than a specific table, and sends all CUD changes since the last push.

Выполняемые по запросу IMobileServiceSyncTable.PullAsync метод для одной таблицы.Pull is performed by the IMobileServiceSyncTable.PullAsync method on a single table. Первый параметр для PullAsync метод — это имя запроса, который используется только на мобильном устройстве.The first parameter to the PullAsync method is a query name that is used only on the mobile device. Результатами запроса от null имя при выполнении пакета SDK Azure Mobile Client добавочной синхронизации, где каждый раз, операция извлечения возвращает результаты, последние updatedAt отметки времени, в результатах хранятся в локальном системные таблицы.Providing a non-null query name results in the Azure Mobile Client SDK performing an incremental sync, where each time a pull operation returns results, the latest updatedAt timestamp from the results is stored in the local system tables. Последующие операции извлечения затем получать только записи после этой метки времени.Subsequent pull operations then only retrieve records after that timestamp. Кроме того полная синхронизация достигается путем передачи null как имя запроса, в результате всех записей, извлекаемых при каждой операции извлечения.Alternatively, full sync can be achieved by passing null as the query name, which results in all records being retrieved on each pull operation. После любой операции синхронизации полученных данных вставляется в локальном хранилище.Following any sync operation, received data is inserted into the local store.

Примечание

Если для таблицы с ожидающими локальными обновлениями выполняется по запросу, по запросу сначала будет выполнена отправка в контекст синхронизации.If a pull is executed against a table that has pending local updates, the pull will first execute a push on the sync context. Это сводит к минимуму конфликты между изменениями, которые уже поставлены в очередь и новые данные из экземпляра мобильных приложений Azure.This minimizes conflicts between changes that are already queued and new data from the Azure Mobile Apps instance.

SyncAsync Также включает базовую реализацию для обработки конфликтов при изменении одной записи в локальном хранилище и на экземпляре мобильных приложений Azure.The SyncAsync method also includes a basic implementation for handling conflicts when the same record has changed in both the local store and in the Azure Mobile Apps instance. Если конфликт связан, что данные были обновлены в локальном хранилище и в случае мобильных приложений Azure SyncAsync метод обновляет данные в локальном хранилище из данных, хранящихся в экземпляре мобильных приложений Azure.When the conflict is that data has been updated both in the local store and in the Azure Mobile Apps instance, the SyncAsync method updates the data in the local store from the data stored in the Azure Mobile Apps instance. При возникновении любого конфликта других SyncAsync метод удаляет локальное изменение.When any other conflict occurs, the SyncAsync method discards the local change. Это обрабатывает сценарий, где существует локальное изменение данных, которая удаляется из экземпляра мобильных приложений Azure.This handles the scenario where a local change exists for data that's been deleted from the Azure Mobile Apps instance.

В рабочем приложении, разработчикам следует написать собственный IMobileServiceSyncHandler обработка конфликтов реализация, которая подходит для их использования.In a production application, developers should write a custom IMobileServiceSyncHandler conflict-handling implementation that's suited to their use case. Дополнительные сведения см. в разделе использовать оптимистическую блокировку для разрешения конфликтов на портале Azure и Подробнее о поддержке автономной в пакете SDK для управляемого клиента в блогах MSDN.For more information, see Use Optimistic Concurrency for conflict resolution on the Azure portal, and Deep dive on the offline support in the managed client SDK on MSDN blogs.

Очистка данныхPurging Data

Можно снять таблиц в локальном хранилище данных с помощью IMobileServiceSyncTable.PurgeAsync метод.Tables in the local store can be cleared of data with the IMobileServiceSyncTable.PurgeAsync method. Этот метод поддерживает сценарии, например удаления устаревших данных, которые приложение больше не требуется.This method supports scenarios such as removing stale data that an application no longer requires. Например, только отображает пример приложения TodoItem экземпляров, которые не выполнены.For example, the sample application only displays TodoItem instances that aren't complete. Таким образом завершенные элементы больше не должны храниться локально.Therefore, completed items no longer need to be stored locally. Очистка завершенных элементов из локального хранилища можно выполнить в следующим образом:Purging completed items from the local store can be accomplished as follows:

await todoTable.PurgeAsync(todoTable.Where(item => item.Done));

Вызов PurgeAsync также запускает операцию принудительной отправки.A call to PurgeAsync also triggers a push operation. Таким образом любые элементы, которые будут помечены как завершенные локально будут отправляться к экземпляру мобильных приложений Azure до их удаления из локального хранилища.Therefore, any items that are marked as complete locally will be sent to the Azure Mobile Apps instance before being removed from the local store. Тем не менее, при наличии ожидающих операций синхронизации с экземпляром мобильных приложений Azure, очистка породит InvalidOperationException Если force параметр имеет значение true.However, if there are operations pending synchronization with the Azure Mobile Apps instance, the purge will throw an InvalidOperationException unless the force parameter is set to true. Альтернативным вариантом является изучаемый IMobileServiceSyncContext.PendingOperations свойство, которое возвращает количество ожидающих операций, которые еще не был отправлен к экземпляру мобильных приложений Azure и выполнять Очистка, только если свойство равно нулю.An alternative strategy is to examine the IMobileServiceSyncContext.PendingOperations property, which returns the number of pending operations that haven't been pushed to the Azure Mobile Apps instance, and only perform the purge if the property is zero.

Примечание

Вызов PurgeAsync с force параметру присвоить true будут потеряны все ожидающие изменения.Invoking PurgeAsync with the force parameter set to true will lose any pending changes.

Запуск синхронизацииInitiating Synchronization

В приложении-примере SyncAsync метод вызывается с помощью TodoList.OnAppearing метод:In the sample application, the SyncAsync method is invoked through the TodoList.OnAppearing method:

protected override async void OnAppearing()
{
  base.OnAppearing();

  // Set syncItems to true to synchronize the data on startup when running in offline mode
  await RefreshItems(true, syncItems: true);
}

Это означает, что приложение будет пытаться выполнить синхронизацию с экземпляром мобильных приложений Azure, при запуске.This means that the application will attempt to sync with the Azure Mobile Apps instance when it starts.

Кроме того, можно будет запускать в iOS и Android с помощью по запросу на обновление в списке данных и на платформах Windows с помощью синхронизации кнопку в пользовательском интерфейсе.In addition, sync can be initiated in iOS and Android by using pull to refresh on the list of data, and on the Windows platforms by using the Sync button on the user interface. Дополнительные сведения см. в разделе потяните, чтобы обновить.For more information, see Pull to Refresh.

СводкаSummary

В этой статье описано, как добавить функцию автономной синхронизации для приложения Xamarin.Forms.This article explained how to add offline sync functionality to a Xamarin.Forms application. Автономная синхронизация позволяет пользователям взаимодействовать с мобильными приложениями, просмотр, добавление или изменение данных, даже в том случае, где нет сетевого подключения.Offline sync allows users to interact with a mobile application, viewing, adding, or modifying data, even where there isn't a network connection. Изменения сохраняются в локальной базе данных, а когда устройство подключено к сети, изменения можно синхронизировать с экземпляром мобильных приложений Azure.Changes are stored in a local database, and once the device is online, the changes can be synced with the Azure Mobile Apps instance.