Поделиться через


Включение автономной синхронизации для мобильного приложения Xamarin.Forms

Обзор

В этом руководстве представлена функция автономной синхронизации мобильных приложений Azure для Xamarin.Forms. Автономная синхронизация позволяет конечным пользователям взаимодействовать с мобильным приложением, просматривать, добавлять или изменять данные даже при отсутствии сетевого подключения. Изменения хранятся в локальной базе данных. После восстановления соединения устройства с сетью эти изменения синхронизируются с дистанционным сервисом.

Это руководство основано на решении быстрого запуска Xamarin.Forms для мобильных приложений, создаваемых при выполнении руководства [Создание приложения Xamarin iOS]. Решение быстрого запуска для Xamarin.Forms содержит код для поддержки автономной синхронизации, которая должна быть включена. В этом руководстве описано, как обновить решение быстрого запуска, чтобы включить автономные функции мобильных приложений Azure. Мы также выделяем специфичный для офлайна код в приложении. Если вы не используете скачаемое решение быстрого запуска, необходимо добавить пакеты расширений доступа к данным в проект. Дополнительные сведения о пакетах расширений сервера см. в статье Работа с пакетом SDK серверного сервера .NET для мобильных приложений Azure.

Дополнительные сведения о функции автономной синхронизации см. в статье автономной синхронизации данных в мобильных приложениях Azure.

Включение функций автономной синхронизации в решении быстрого запуска

Код автономной синхронизации включен в проект с помощью директив препроцессора C#. При определении символа OFFLINE_SYNC_ENABLED эти пути кода включаются в сборку. Для приложений Windows также необходимо установить платформу SQLite.

  1. В Visual Studio щелкните правой кнопкой мыши решение >Управление пакетами NuGet для решения..., а затем найдите и установите Microsoft.Azure.Mobile.Client.SQLiteStore пакет NuGet для всех проектов в решении.

  2. В обозревателе решений откройте файл TodoItemManager.cs из проекта, в названии которого есть Portable, представляющего проект переносимой библиотеки классов. Затем раскомментируйте следующую директиву препроцессора:

     #define OFFLINE_SYNC_ENABLED
    
  3. (Необязательно) Чтобы поддерживать устройства Windows, установите один из следующих пакетов среды выполнения SQLite:

  4. (Необязательно) В каждом проекте приложения Windows щелкните правой кнопкой мыши на Ссылкии выберите>Добавить ссылку..., разверните папку Windows>Расширения. Включите соответствующий пакет SQLite для Windows SDK вместе с пакетом Visual C++ 2013 для Windows SDK. Имена пакета SDK SQLite немного отличаются от каждой платформы Windows.

Просмотр кода синхронизации клиента

Ниже приведен краткий обзор того, что уже имеется в коде учебного материала в директивах #if OFFLINE_SYNC_ENABLED. Функция автономной синхронизации находится в файле проекта TodoItemManager.cs в проекте переносимой библиотеки классов. Общие сведения о функции см. в статье Автономная синхронизация данных в мобильных приложениях Azure.

  • Перед выполнением любых операций таблицы необходимо инициализировать локальное хранилище. База данных локального магазина инициализирована в конструкторе класса TodoItemManager с помощью следующего кода:

      var store = new MobileServiceSQLiteStore(OfflineDbPath);
      store.DefineTable<TodoItem>();
    
      //Initializes the SyncContext using the default IMobileServiceSyncHandler.
      this.client.SyncContext.InitializeAsync(store);
    
      this.todoTable = client.GetSyncTable<TodoItem>();
    

    Этот код создает локальную базу данных SQLite с помощью класса MobileServiceSQLiteStore.

    Метод DefineTable создает таблицу в локальном хранилище, которое соответствует полям указанного типа. Тип не должен включать все столбцы, которые находятся в удаленной базе данных. Можно сохранить подмножество столбцов.

  • Поле todoTable в TodoItemManager имеет тип IMobileServiceSyncTable вместо IMobileServiceTable. Этот класс использует локальную базу данных для всех операций создания, чтения, обновления и удаления (CRUD). Вы решите, когда эти изменения отправляются в серверную часть мобильного приложения, вызвав PushAsync на IMobileServiceSyncContext. Контекст синхронизации помогает сохранять связи таблиц путем отслеживания и отправки изменений во всех таблицах клиентского приложения, измененного при вызове PushAsync.

    Для синхронизации с серверной частью мобильного приложения вызывается следующий метод SyncAsync:

      public async Task SyncAsync()
      {
          ReadOnlyCollection<MobileServiceTableOperationError> syncErrors = null;
    
          try
          {
              await this.client.SyncContext.PushAsync();
    
              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, reverting 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"]);
              }
          }
      }
    

    В этом примере используется простая обработка ошибок с обработчиком синхронизации по умолчанию. Реальное приложение будет обрабатывать различные ошибки, такие как ошибки сети и конфликты сервера, с помощью кастомной реализации IMobileServiceSyncHandler.

Рекомендации по автономной синхронизации

В примере метод syncAsync вызывается только при запуске и при запросе синхронизации. Чтобы инициировать синхронизацию в приложении Android или iOS, потяните вниз на списке элементов; для Windows используйте кнопку Синхронизация. В реальном приложении можно также сделать триггер синхронизации при изменении состояния сети.

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

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

Запуск клиентского приложения

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

Обновление поведения синхронизации клиентского приложения

В этом разделе измените клиентский проект, чтобы имитировать автономный сценарий, используя неверный URL-адрес приложения для вашей серверной части. Кроме того, можно отключить сетевые подключения, переместив устройство в режим "Самолет". При добавлении или изменении элементов данных эти изменения хранятся в локальном хранилище, но не синхронизируются с серверным хранилищем данных, пока подключение не будет восстановлено.

  1. В обозревателе решений откройте файл проекта Constants.cs из проекта портативного и измените значение ApplicationURL, чтобы указать недопустимый URL-адрес:

     public static string ApplicationURL = @"https://your-service.azurewebsites.net/";
    
  2. Откройте файл TodoItemManager.cs из проекта Portable, а затем добавьте catch для базового класса Exception в блок try...catch в SyncAsync. Этот блок перехвата записывает сообщение об исключении в консоль следующим образом:

         catch (Exception ex)
         {
             Console.Error.WriteLine(@"Exception: {0}", ex.Message);
         }
    
  3. Создайте и запустите клиентское приложение. Добавьте некоторые новые элементы. Обратите внимание, что исключение регистрируется в консоли для каждой попытки синхронизации с серверной частью. Эти новые элементы существуют только в локальном хранилище, пока они не смогут быть отправлены на серверную часть мобильного устройства. Клиентское приложение работает так, как если бы оно подключено к серверной части, поддерживая все операции создания, чтения, обновления, удаления (CRUD).

  4. Закройте приложение и перезапустите его, чтобы убедиться, что созданные элементы сохраняются в локальном хранилище.

  5. (Необязательно) Используйте Visual Studio для просмотра таблицы Базы данных SQL Azure, чтобы увидеть, что данные в серверной базе данных не изменились.

    В Visual Studio откройте Обозреватель серверов. Перейдите к базе данных в Azure—>базах данных SQL. Щелкните базу данных правой кнопкой мыши и выберите Открыть в обозревателе объектов SQL Server. Теперь вы можете перейти к таблице базы данных SQL и ее содержимому.

Обновление клиентского приложения для повторного подключения серверной части мобильного устройства

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

  1. Повторно откройте Constants.cs. Исправьте applicationURL, чтобы указать правильный URL-адрес.

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

  3. (Необязательно) Просмотр обновленных данных с помощью обозревателя объектов SQL Server или средства REST, например Fiddler или Postman. Обратите внимание, что данные синхронизированы между серверной базой данных и локальным хранилищем.

    Обратите внимание, что данные синхронизированы между базой данных и локальным хранилищем и содержат элементы, добавленные во время отключения приложения.

Дополнительные ресурсы