Работа с данными в мобильных приложениях. Реализуем offline хранилище и синхронизацию данных используя Microsoft Azure и SQLite

image

Сейчас на рынке есть огромное количество приложений, которые не приспособлены для работы offline, что создает неудобства для пользователей. Некоторое время назад, для разработчиков на C# стал доступен новый Microsoft Azure Mobile Services SQLiteStore SDK 1.0 alpha, который предоставляет API для создания приложения, работающих в условиях отсутствия интернета и берущий на себя все заботы о синхронизации данных между локальной базой данных и базой данных Azure. В качестве локальной базы данных создается и используется SQLite.Итак, у нас есть следующие популярные способы организации offline хранилища:

  • Сериализация в XML, JSON или другой NoSQL.
  • SQLite или другие сторонние БД.

Механизмы синхронизации:

  • Каждый раз обновляется локальная копия базы полностью.
  • Только изменения передаются по сети.

Средства синхронизации:

Azure Mobile Services SDK для синхронизации

Функциональность нового Microsoft Azure Mobile Services SQLiteStore SDK 1.0 alpha для синхронизации данных не идентична Sync Framework или Azure Data Sync. С точки зрения клиентской стороны, пока есть возможность работать только с SQLite, но создатели обещают, что возможности будут развиваться и другие клиентские БД добавятся позже. Серверная сторона поддерживает следующие базы данных: SQL Database, MongoDB и Azure Table Storage. SDK поддерживает следующие операции: Push (отправка на сервер), Pull (загрузка с сервера), Purge (очистка локального хранилища). Сегодня мы остановимся на том, как создать бэкенд для вашего приложения используя Microsoft Azure Mobile Services SQLiteStore SDK 1.0 alpha. Для работы нам понадобится:

Наша задача будет состоять из следующих пунктов:

  • Создание мобильного сервиса и мобильной БД в Microsoft Azure;
  • Создание проекта приложения. Мы будем делать универсальное приложение в Visual Studio.
  • Создание локальной БД приложения.
  • Реализации синхронизации данных.

Давайте приступим…

Настройка Azure Mobile Services

1. Чтобы создать Azure Mobile Service для вашего проекта, необходимо открыть Microsoft Azure Portal и перейти в меню Mobile ServicesNew

Создавая облачный сервис, вы можете выбрать на каком языке вы будете писать код сервиса. На С# или JavaScript.

2. Когда мобильный сервис создастся, на главной странице сервиса, вы сможете найти инструкции, как использовать его в приложениях для многих популярных платформ и фреймфорков, таких как Windows, Windows Phone, IOS, Android, Xamarin.

3. Вы можете скачать шаблон проекта облачного сервиса, доработать его код, например, поправив модель данных как на скриншоте ниже.

4. Затем, опубликовать в облаке из Visual Studio.

Как разработать и опубликовать облачный сервис достаточно подробно написано тут.

Создаем проект приложения

1. Я буду использовать проект универсального приложения для Windows и Windows Phone.

2. После создания проекта, подключим необходимые библиотеки. Так как у нас проект и для Windows и для Windows Phone, то установить WindowsAzure.MobileServices надо для обоих проектов.

3. В общем проекте (Shared), открываем App.xaml.cs и добавляем туда объявление мобильного сервиса:

public static MobileServiceClient MobileService = new MobileServiceClient("https://demo-backend.azure-mobile.net/", "ZDgibxPOCWSwOvbYJvAAipjAybMIJO51");

4. Теперь мы можем работать с данными через облачный сервис и сохранять данныe в БД.

Создание локальной базы данных и синхронизация

Теперь нам надо создать локальное хранилище данных SQLite.

1. Установим SQLite для Windows 8.1 и SQLite для Windows Phone 8.1

2. Добавим SQLite в качестве используемой библиотеки для наших приложений Windows и Windows Phone.

3. Установим и добавим в References пакет WindowsAzure.MobileServices.SQLiteStore

4. Откроем Shared проект и создадим там новый пустой класс с моделью данных. В моем случае, он получился вот такой:

5. Создадим вспомогательный класс, который будет создавать нам локальную базу данных, уметь наполнять её данными и отправлять данные в облачный сервис.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using Microsoft.WindowsAzure.MobileServices.Sync;

using Microsoft.WindowsAzure.MobileServices.SQLiteStore;

using System.Threading;

namespace DemoApp

{

public static class MobileServicesSync

{

public static async void InitSQLiteStore() {

if (!App.MobileService.SyncContext.IsInitialized) {

var store = new MobileServiceSQLiteStore("DemoAppSync.db");

store.DefineTable();

await App.MobileService.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());

}

}

public static async void InsertItem(MyAppItem item) {

IMobileServiceSyncTable table = App.MobileService.GetSyncTable();

await table.InsertAsync(item);

}

public static async void Push() {

string errorString = null;

try {

CancellationToken token = new CancellationToken();

await App.MobileService.SyncContext.PushAsync(token);

} 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;

}

}

}

}

Интерфейс приложения

1. Откроем MainPage.xaml и добавим туда кнопки для заполнения таблицы данными и синхронизации.

 2. Добавим в MainPage.xaml.cs код для обработки событий.

public MainPage() {

this.InitializeComponent();

MobileServicesSync.InitSQLiteStore();

}

private void addBtn_Click(object sender, RoutedEventArgs e) {

MobileServicesSync.InsertItem(new MyAppItem { Text="Ура!" });

}

private void syncBtn_Click(object sender, RoutedEventArgs e) { MobileServicesSync.Push(); }

Запуск и проверка

1. Запустим приложение и посмотрим как оно работает.

2. Как только мы запустили приложение, у нас уже создалась локальная база SQLite. Мы можем найти её в папке приложения и посмотреть. Для этого я буду использовать SQLite Browser.

Моя БД лежит тут: C:\Users\[username]\AppData\Local\Packages\[app id]\LocalState

Как видите, сейчас она пустая.

3. Добавим в неё элемент, нажав на кнопку Add Item нашего приложения.

4. Данные в базе обновятся и туда добавится запись, но наша облачная БД всё еще пуста.

5. Теперь нажмем на кнопку Sync в приложении для синхронизации баз данных и смотрим результат.

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

Примечание: для тех, у кого не получилось.

Может так оказаться, что создание локальной БД упадет с ошибкой. Тогда найдите и добавьте в References сборку SQLitePCL.Ext.dll. Сама она почему-то не всегда устанавливается NuGet’ом.

Заключение

Новый Microsoft Azure Mobile Services и его SDK имеет много новых полезных возможностей для разработчиков приложений. Одна из них – это поддержка offline работы и синхронизации данных для приложений. Следуя этой инструкции, вы можете настроить синхронизацию данных для вашего Phone или Windows приложения не тратя много времени на сложные алгоритмы и написание библиотек.

Полезные ссылки