Включение автономной синхронизации для мобильного приложения Xamarin.Android
Обзор
В этом учебнике представлена функция автономной синхронизации мобильных приложений Azure для Xamarin.Android. Автономная синхронизация позволяет конечным пользователям взаимодействовать с мобильным приложением — просматривать, добавлять или изменять данные — даже при отсутствии подключения к сети. Изменения сохраняются в локальной базе данных. Как только устройство возвращается в режим подключения к сети, эти изменения синхронизируются с удаленной службой.
Из этого руководства вы узнаете, как обновить клиентский проект, описанный в руководстве Создание приложения Xamarin.Android, чтобы обеспечить поддержку автономных функций мобильных приложений Azure. Если вы не используете скачанный проект быстрого запуска сервера, в проект необходимо добавить пакет расширений доступа к данным. Дополнительные сведения о пакетах расширений для сервера см. в статье Работа с пакетом SDK для внутреннего сервера .NET для мобильных приложений Azure.
Дополнительные сведения о функции автономной синхронизации см. в статье Синхронизация автономных данных в мобильных приложениях Azure.
Обновление клиентского приложения для поддержки автономных функций
Автономные функции мобильных приложений Azure позволяют взаимодействовать с локальной базой данных в случае автономной работы. Для использования этих функций в приложении необходимо инициализировать SyncContext в локальном хранилище. Затем необходимо сослаться на таблицу с помощью интерфейса IMobileServiceSyncTable. SQLite используется как локальное хранилище на устройстве.
- В Visual Studio откройте диспетчер пакетов NuGet в проекте, созданном при работе с руководством Создание приложения Xamarin.Android. Найдите и установите пакет NuGet Microsoft.Azure.Mobile.Client.SQLiteStore.
- Откройте файл ToDoActivity.cs и раскомментируйте определение
#define OFFLINE_SYNC_ENABLED
. - В Visual Studio нажмите клавишу F5 , чтобы выполнить сборку и запустить клиентское приложение. Приложение работает так же, как и до включения автономной синхронизации. Однако локальная база данных теперь заполняется данными, которые можно использовать в автономном сценарии.
Обновление приложения для отключения от серверной части
В этом разделе вы разорвете связь с серверной частью мобильного приложения для имитации автономного режима. При добавлении элементов данных обработчик исключений сообщает, что приложение работает в автономном режиме. В этом состоянии новые элементы добавляются в локальное хранилище и синхронизируются с серверной частью мобильного приложения при отправке данных в подключенном состоянии.
Измените файл ToDoActivity.cs в общем проекте. Укажите для параметра applicationURL недопустимый URL-адрес.
const string applicationURL = @"https://your-service.azurewebsites.fail";
Чтобы продемонстрировать поведение в автономном режиме, отключите на устройстве Wi-Fi и мобильную связь и включите режим "в самолете".
Нажмите клавишу F5 , чтобы создать и запустить приложение. Обратите внимание, синхронизацию не удалось выполнить при обновлении во время запуска приложения.
Введите новые элементы. Учтите, что при каждом нажатии кнопки Сохранить отправка завершается сбоем с состоянием [CancelledByNetworkError]. Однако новые элементы списка существуют в локальном хранилище, пока они не будут перемещены в серверную часть мобильного приложения. В рабочем приложении при подавлении этих исключений клиентское приложение ведет себя так, как если бы оно по-прежнему было подключено к серверной части мобильного приложения.
Закройте приложение и перезапустите его, чтобы убедиться, что новые элементы сохранены в локальном хранилище.
В Visual Studio в откройте обозреватель сервера. перейдите к базе данных в базах данных Azure>SQL. Щелкните правой кнопкой мыши базу данных и выберите пункт Открыть в обозревателе объектов SQL Server. Теперь можно перейти к таблице базы данных SQL и ее содержимому. Убедитесь, что данные в серверной базе данных не изменились.
(Необязательно.) Воспользуйтесь инструментом REST, например Fiddler или Postman, чтобы выполнить запрос к мобильной серверной части с помощью запроса GET вида
https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem
.
Обновление приложения для повторного подключения к серверной части мобильного приложения
В этом разделе вы повторно подключите приложение к серверной части мобильного приложения. При первом запуске приложения обработчик событий OnCreate
вызывает OnRefreshItemsSelected
. Этот метод вызывает SyncAsync
для синхронизации локального хранилища с серверной базой данных.
Откройте файл ToDoActivity.cs в общем проекте и отмените изменения в свойстве applicationURL.
Нажмите клавишу F5 , чтобы перестроить и запустить приложение. Приложение синхронизирует локальные изменения с серверной частью мобильного приложения Azure, применяя операции отправки и извлечения после выполнения метода
OnRefreshItemsSelected
.(Необязательно.) Просмотрите обновленные данные, используя обозреватель объектов SQL Server или инструмент REST, например Fiddler. Обратите внимание, что данные синхронизированы между базой данных серверной части мобильного приложения Azure и локальным хранилищем.
В приложении установите флажки рядом с некоторыми элементами, отметив их в локальном хранилище как выполненные.
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"); } }