В прошлой статье я показал как создать простейшее приложение, использующее Azure Mobile Services.
В этот раз я покажу как реализуется кеширование для приложения использующего Azure Mobile Services.
Напомню, что сейчас приложение умеет добавлять/удалять данные и отображать их, при этом всегда загружая данные из сети.
Для работы кэша будет использоваться SQLite. В приложение нужно подключить библиотеки для работы с ним. Для этого в Solution Explorer необходимо щелкнуть правой клавишей мыши по разделу References и выбрать пункт «Add Reference…», затем перейти в раздел Windows Phone SDK – Extensions и выбрать «SQLite for Windows Phone».
Если данной библиотеки здесь не будет, то необходимо её скачать и установить отсюда.
Далее необходимо отключить компиляцию под все процессоры и выбрать целевой, x86 будет работать в эмуляторе, а ARM на телефоне.
Добавляем пакет SQLiteStore. Для этого выбираем Manage NuGet Packages, в строку поиска записываем «SQLiteStore», после того, как нужный пакет найден остаётся нажать Install.
На этом с подключением библиотек закончено, переходим к непосредственному изменению кода.
В вайл 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 для получения изменений с сервера.
Обработка нажатия для кнопок выглядит следующим образом
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.");
}
}
Сейчас можно запускать приложение и проверять его работу.
Приложение работает следующим образом: по кнопке Refresh можно вывести список из ЛОКАЛЬНОЙ базы. При нажатии на Pull происходит получение данных с сервера, а при нажатии на Push запись данных на сервер. В таком виде приложение может работать без подключения к интернету используя SQLite базу данных в приложении. А таком виде можно добавлять новые, удалять записи и при этом это не затронет базу данных на сервере до нажатия кнопки Push.
Резюме:
При работе в Azure Mobile Services при необходимости использовать кэширующую систему или возможность работать с базой без интернет подключения можно использовать локальный SQLite. Для этого нужно подключить несколько библиотек и совсем незначительно изменить код.
Для поддержки автономности приложения используется интерфейс IMobileServiceSyncTable вместо IMobileServiceTable. При этом все операции будут работать абсолютно также, как и при работе с базой на сервере.
Для синхронизации локальной базы с сервером используется IMobileServiceSyncContext.PushAsync()
Чтобы получить данные с сервера необзодимо использовать IMobileServiceSyncTable.PullAsync.
На основе данного материала