Работа с данными в мобильных приложениях. Реализуем offline хранилище и синхронизацию данных используя Microsoft Azure и SQLite
Сейчас на рынке есть огромное количество приложений, которые не приспособлены для работы offline, что создает неудобства для пользователей. Некоторое время назад, для разработчиков на C# стал доступен новый Microsoft Azure Mobile Services SQLiteStore SDK 1.0 alpha, который предоставляет API для создания приложения, работающих в условиях отсутствия интернета и берущий на себя все заботы о синхронизации данных между локальной базой данных и базой данных Azure. В качестве локальной базы данных создается и используется SQLite.Итак, у нас есть следующие популярные способы организации offline хранилища:
- Сериализация в XML, JSON или другой NoSQL.
- SQLite или другие сторонние БД.
Механизмы синхронизации:
- Каждый раз обновляется локальная копия базы полностью.
- Только изменения передаются по сети.
Средства синхронизации:
- Sync Framework Toolkit
- Azure SQL Data Sync
- Разработка собственной логики и библиотек для синхронизации.
- Microsoft Azure Mobile Services SQLiteStore SDK 1.0 alpha ( !Новое)
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. Для работы нам понадобится:
- Подписка Azure - на сайте можно оформить trial на месяц
- Windows 8.1
- Visual Studio 2013 Update 2
Наша задача будет состоять из следующих пунктов:
- Создание мобильного сервиса и мобильной БД в Microsoft Azure;
- Создание проекта приложения. Мы будем делать универсальное приложение в Visual Studio.
- Создание локальной БД приложения.
- Реализации синхронизации данных.
Давайте приступим…
Настройка Azure Mobile Services
1. Чтобы создать Azure Mobile Service для вашего проекта, необходимо открыть Microsoft Azure Portal и перейти в меню Mobile Services – New
Создавая облачный сервис, вы можете выбрать на каком языке вы будете писать код сервиса. На С# или 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 приложения не тратя много времени на сложные алгоритмы и написание библиотек.
Полезные ссылки
Blog: Deep dive on the offline support in the Azure Mobile Service managed client SDK
Tutorial: Get started with offline data
Tutorial: Handle conflicts with offline data in Mobile Services
Попробовать Azure бесплатно на 30 дней!
Загрузить бесплатную или пробную Visual Studio
Пройти обучающие курсы на виртуальной академии Microsoft (MVA)
- Разработка приложений на платформе Microsoft
- Кросс-платформенная разработка приложений для Windows Phone и Windows 8
- Разработка приложений с общим кодом для платформ Windows 8 и Windows Phone
- Сложные приёмы разработки приложений для Windows Phone 8
- Расширенные возможности разработки для Windows Phone 8
- или курсы по разработке в облаке Azure
- или многие другие бесплатные курсы MVA!
Стать разработчиком приложений Windows Phone