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


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

Обзор

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

Из этого руководства вы узнаете, как обновить клиентский проект, описанный в руководстве Создание приложения Xamarin.Android, чтобы обеспечить поддержку автономных функций мобильных приложений Azure. Если вы не используете скачанный проект быстрого запуска сервера, в проект необходимо добавить пакет расширений доступа к данным. Дополнительные сведения о пакетах расширений для сервера см. в статье Работа с пакетом SDK для внутреннего сервера .NET для мобильных приложений Azure.

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

Обновление клиентского приложения для поддержки автономных функций

Автономные функции мобильных приложений Azure позволяют взаимодействовать с локальной базой данных в случае автономной работы. Для использования этих функций в приложении необходимо инициализировать SyncContext в локальном хранилище. Затем необходимо сослаться на таблицу с помощью интерфейса IMobileServiceSyncTable. SQLite используется как локальное хранилище на устройстве.

  1. В Visual Studio откройте диспетчер пакетов NuGet в проекте, созданном при работе с руководством Создание приложения Xamarin.Android. Найдите и установите пакет NuGet Microsoft.Azure.Mobile.Client.SQLiteStore.
  2. Откройте файл ToDoActivity.cs и раскомментируйте определение #define OFFLINE_SYNC_ENABLED.
  3. В Visual Studio нажмите клавишу F5 , чтобы выполнить сборку и запустить клиентское приложение. Приложение работает так же, как и до включения автономной синхронизации. Однако локальная база данных теперь заполняется данными, которые можно использовать в автономном сценарии.

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

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

  1. Измените файл ToDoActivity.cs в общем проекте. Укажите для параметра applicationURL недопустимый URL-адрес.

      const string applicationURL = @"https://your-service.azurewebsites.fail";
    

    Чтобы продемонстрировать поведение в автономном режиме, отключите на устройстве Wi-Fi и мобильную связь и включите режим "в самолете".

  2. Нажмите клавишу F5 , чтобы создать и запустить приложение. Обратите внимание, синхронизацию не удалось выполнить при обновлении во время запуска приложения.

  3. Введите новые элементы. Учтите, что при каждом нажатии кнопки Сохранить отправка завершается сбоем с состоянием [CancelledByNetworkError]. Однако новые элементы списка существуют в локальном хранилище, пока они не будут перемещены в серверную часть мобильного приложения. В рабочем приложении при подавлении этих исключений клиентское приложение ведет себя так, как если бы оно по-прежнему было подключено к серверной части мобильного приложения.

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

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

  6. (Необязательно.) Воспользуйтесь инструментом REST, например Fiddler или Postman, чтобы выполнить запрос к мобильной серверной части с помощью запроса GET вида https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem.

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

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

  1. Откройте файл ToDoActivity.cs в общем проекте и отмените изменения в свойстве applicationURL.

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

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

  4. В приложении установите флажки рядом с некоторыми элементами, отметив их в локальном хранилище как выполненные.

    CheckItem вызывает SyncAsync для синхронизации каждого выполненного элемента с серверной частью мобильного приложения. SyncAsync вызывает операцию отправки и извлечения данных. При каждом выполнении операции извлечения данных в отношении таблицы, в которую клиент внес изменения, операция отправки данных всегда выполняется автоматически. Это позволяет обеспечить согласованность всех таблиц в локальном хранилище, а также связей между ними. Такое поведение может привести к непредвиденной отправке данных. Дополнительные сведения об этом поведении см. в статье Автономная синхронизация данных в мобильных приложениях Azure.

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

Клиентский проект Xamarin, загруженный при изучении руководства Создание приложения Xamarin.Android, уже содержит код, который поддерживает автономную синхронизацию с использованием локальной базы данных SQLite. Вот краткое содержание материала, уже включенного в код учебника. Общие сведения об этой функции см. в статье Синхронизация автономных данных в мобильных приложениях Azure.

  • Прежде чем можно будет выполнить операции с таблицами, необходимо инициализировать локальное хранилище. Инициализация базы данных локального хранилища происходит, когда ToDoActivity.OnCreate() выполняет ToDoActivity.InitLocalStoreAsync(). С помощью указанного метода создается локальная база данных SQLite с использованием класса MobileServiceSQLiteStore, предоставленного клиентским пакетом SDK для мобильных приложений Azure.

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

      // ToDoActivity.cs
      private async Task InitLocalStoreAsync()
      {
          // new code to initialize the SQLite store
          string path = Path.Combine(System.Environment
              .GetFolderPath(System.Environment.SpecialFolder.Personal), localDbFilename);
    
          if (!File.Exists(path))
          {
              File.Create(path).Dispose();
          }
    
          var store = new MobileServiceSQLiteStore(path);
          store.DefineTable<ToDoItem>();
    
          // Uses the default conflict handler, which fails on conflict
          // To use a different conflict handler, pass a parameter to InitializeAsync.
          // For more details, see https://go.microsoft.com/fwlink/?LinkId=521416.
          await client.SyncContext.InitializeAsync(store);
      }
    
  • Элемент toDoTable в ToDoActivity имеет тип IMobileServiceSyncTable, а не IMobileServiceTable. IMobileServiceSyncTable направляет все операции создания, чтения, обновления и удаления (CRUD) с таблицей в базу данных локального хранилища.

    Вы можете решить, когда изменения будут передаваться в серверную часть мобильного приложения, вызвав IMobileServiceSyncContext.PushAsync(). Контекст синхронизации помогает сохранить связи между таблицами, отслеживая и отправляя изменения во всех таблицах, измененных клиентским приложением при вызове PushAsync .

    Представленный код вызывает метод ToDoActivity.SyncAsync() для синхронизации при каждом обновлении списка элементов Todoitem или добавлении либо завершении элемента Todoitem. Код синхронизируется после каждого локального изменения.

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

      // ToDoActivity.cs
      private async Task SyncAsync()
      {
          try {
              await client.SyncContext.PushAsync();
              await toDoTable.PullAsync("allTodoItems", toDoTable.CreateQuery()); // query ID is used for incremental sync
          } catch (Java.Net.MalformedURLException) {
              CreateAndShowDialog (new Exception ("There was an error creating the Mobile Service. Verify the URL"), "Error");
          } catch (Exception e) {
              CreateAndShowDialog (e, "Error");
          }
      }
    

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