Работа с Azure Mobile Services часть 2

В прошлой статье я показал как создать простейшее приложение, использующее Azure Mobile Services.

В этот раз я покажу как реализуется кеширование для приложения использующего Azure Mobile Services.

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

Для работы кэша будет использоваться SQLite. В приложение нужно подключить библиотеки для работы с ним. Для этого в Solution Explorer необходимо щелкнуть правой клавишей мыши по разделу References и выбрать пункт «Add Reference…», затем перейти в раздел Windows Phone SDKExtensions и выбрать «SQLite for Windows Phone».

Добавление SQLite for Windows Phone

Если данной библиотеки здесь не будет, то необходимо её скачать и установить отсюда.

Далее необходимо отключить компиляцию под все процессоры и выбрать целевой, x86 будет работать в эмуляторе, а ARM на телефоне.

Компиляция для x86

Добавляем пакет SQLiteStore. Для этого выбираем Manage NuGet Packages, в строку поиска записываем «SQLiteStore», после того, как нужный пакет найден остаётся нажать Install.

Добавление SQLiteStore

На этом с подключением библиотек закончено, переходим к непосредственному изменению кода.

В вайл MainPage.xaml.cs добавляем пространства имён

using Microsoft.WindowsAzure.MobileServices.SQLiteStore;
using Microsoft.WindowsAzure.MobileServices.Sync;
using Newtonsoft.Json.Linq;

Я рекомендую использовать ReSharper в случае его использования он сам предложит использовать нужное пространство имён.

Теперь находим строку

private IMobileServiceTable todoTable = App.MobileService.GetTable();

И заменяем её на

private IMobileServiceSyncTable todoTable = App.MobileService.GetSyncTable();

В класс TodoItem добавляем свойство Version

public class TodoItem
{
  public string Id { get; set; }
  [JsonProperty(PropertyName = "text")]
  public string Text { get; set; }
  [JsonProperty(PropertyName = "complete")]
  public bool Complete { get; set; }
  [Version]
  public string Version { get; set; }
}

Теперь переходим к событию OnNavigatedTo, его необходимо обновить до следующего вида:

protected override async void OnNavigatedTo(NavigationEventArgs e)
        {
            if (!App.MobileService.SyncContext.IsInitialized)
            {
                var store = new MobileServiceSQLiteStore("data.db");
                store.DefineTable();
                await App.MobileService.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());
            }
            RefreshTodoItems();
        }

Теперь добавим в приложение еще 2 кнопки Push – для отправки изменений на сервер и Pull для получения изменений с сервера.

Изменённое приложение Windows Phone 8

Обработка нажатия для кнопок выглядит следующим образом

private async void ButtonPull_Click(object sender, RoutedEventArgs e)
        {
            Exception pullException = null;
            try
            {
                await todoTable.PullAsync();
                RefreshTodoItems();
            }
            catch (Exception ex)
            {
                pullException = ex;
            }
            if (pullException != null)
            {
                MessageBox.Show("Pull failed: " + pullException.Message +
                  "\n\nIf you are in an offline scenario, " +
                  "try your Pull again when connected with your Mobile Serice.");
            }
        }

        private async void ButtonPush_Click(object sender, RoutedEventArgs e)
        {
            string errorString = null;
            try
            {
                await App.MobileService.SyncContext.PushAsync();
                RefreshTodoItems();
            }
            catch (MobileServicePushFailedException ex)
            {
                errorString = "Push failed because of sync errors: " +
                  ex.PushResult.Errors.Count() + ", message: " + ex.Message;
            }
            catch (Exception ex)
            {
                errorString = "Push failed: " + ex.Message;
            }
            if (errorString != null)
            {
                MessageBox.Show(errorString +
                  "\n\nIf you are in an offline scenario, " +
                  "try your Push again when connected with your Mobile Serice.");
            }
        }

Сейчас можно запускать приложение и проверять его работу.

Приложение Windows Phone 8 использует локальную SQLite базу

Приложение работает следующим образом: по кнопке Refresh можно вывести список из ЛОКАЛЬНОЙ базы. При нажатии на Pull происходит получение данных с сервера, а при нажатии на Push запись данных на сервер. В таком виде приложение может работать без подключения к интернету используя SQLite базу данных в приложении. А таком виде можно добавлять новые, удалять записи и при этом это не затронет базу данных на сервере до нажатия кнопки Push.

Резюме:

При работе в Azure Mobile Services при необходимости использовать кэширующую систему или возможность работать с базой без интернет подключения можно использовать локальный SQLite. Для этого нужно подключить несколько библиотек и совсем незначительно изменить код.

Для поддержки автономности приложения используется интерфейс IMobileServiceSyncTable вместо IMobileServiceTable. При этом все операции будут работать абсолютно также, как и при работе с базой на сервере.

Для синхронизации локальной базы с сервером используется IMobileServiceSyncContext.PushAsync()

Чтобы получить данные с сервера необзодимо использовать IMobileServiceSyncTable.PullAsync.

На основе данного материала

Добавить комментарий