Приложение Windows 10 с данными в облаке с помощью Azure Mobile Apps

7e03b6da20e04701a2177ab465e5a1c6.png


Руководство о том, как с помощью несложной конфигурации и нескольких строчек кода создать веб сервис с облачной базой данных и мобильное приложение с доступом к этим самым данным. Я опишу как создать приложение Windows 10, хотя сервис позволяет создавать приложения и под другие популярные платформы. Руководство будет особенно интересно студентам, так как с недавних пор обладатели студенческой подписки Microsoft Azure для DreamSpark могут воспользоваться сервисом Mobile Apps бесплатно.
Заходим на portal.azure.com
И создаем Mobile App (мобильное приложение)

8f07818910d948588336568c47fe638c.PNG

Приложение разворачивается несколько минут

a84c65fe21414cb694c449c1c5452304.PNG

После окончания развертывания мы можем приступать к конфигурированию приложения

47c80abe7e324c6fa2989abb52523f76.PNG

Как вы можете заметить, имеется возможность создавать приложения не только под различные платформы, но и на различных языках.

Так как у нас не создано подключение к базе данных, то нам нужно его создать

8aee4147becc4bd89e90a45968315289.PNG

Создаем новую базу и новый сервер

92d21ac225cb4ad48b69d743a9062938.PNG

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

34da4558db8e4825bf1c6be39387191e.PNG

Не забываем везде, где применили настройки, нажать «ОК».

Теперь мы можем создать бекенд сервис на основе NodeJS или на базе C# приложения. Если вы не хотите заморачиваться, то выбирайте NodeJS. В этом случае вам достаточно будет только нажать на кнопку, и сервис будет развернут. При этом будет создана таблица с демо данными. Альтернативно вы можете скачать веб приложение C#, сделать необходимые вам изменения, после чего опубликовать его. Как опубликовать серверный проект читайте здесь: Практическое руководство. Публикация серверного проекта

Вот так выглядит окошко в котором необходимо сделать выбор между NodeJS и C# в качестве бекенда

f2b86a0ee358436c806827d3b49e63aa.PNG

Если не хотите создавать демо таблицу, то активировать и автоматически создать веб сервис можно еще и в другом месте.
Я предпочту для примера использовать NodeJS, хотя для рабочего приложения, предпочел бы C#, так как это все-таки язык, на котором я пишу.

В том же окошке вы можете скачать пример клиентского приложения (на данный момент приложения Windows 8.1)

3ad82142b100440bba5483322908e1e6.PNG

Следующим этапом работаем с таблицей данных. Заходим в параметры и далее в «Простые таблицы»

3ecc86651d8e4c26bac57f04f3ebd8ad.PNG

Если вы не создавали бекенд сервис, то вам будет предложено его инициализировать

74c8afa2f0fd420aa19db356d0060a1c.PNG

Нужно поставить галочку, подтверждающую, что я в курсе, что содержимое моего сайта будет заменено созданным сервисом и нажать Initialize App.

Теперь в простых таблицах можно создать новую таблицу (я создал таблицу с названием mydemotable).

b6c8a529be5243b2b7d416caaaf9661c.PNG

При создании таблицы некоторые поля создаются автоматически

6c0b4ec3a8f946f9a2bec521b2e018f0.PNG

Я добавлю к ним 2 поля: salary и surname, в которых буду как бы хранить информацию о зарплате и фамилиях своих воображаемых сотрудников

9642f1cf902541ef95edfb4e2b39ad3a.PNG

После этого этап настройки закончен (конечно, на реальном проекте можно и нужно будет настраивать еще права доступа и конфигурировать бекенд под свои нужды).

Теперь можно перейти к коду.
В Visual Studio создаем проект универсального приложения. В NuGet находим и устанавливаем пакет Microsoft.Azure.Mobile.Client.

В App.xaml.cs добавляем пространство имен:

using Microsoft.WindowsAzure.MobileServices;


и объявляем

 public static MobileServiceClient MobileService =
         new MobileServiceClient("https://mydemomobservice.azurewebsites.net");


Теперь нам нужно создать класс с аналогичной нашей облачной таблице структурой.

    public class mydemotable
    {
        public string Id { get; set; }
        [JsonProperty(PropertyName = "surname")]
        public string surname { get; set; }
        [JsonProperty(PropertyName = "salary")]
        public int salary { get; set; }
    }


Вы можете заметить, что здесь указано поле Id. Это поле обязательно, остальные системные поля таблицы можно не указывать. С помощью атрибута JsonProperty можно сопоставить название поля класса столбцу таблицы (полезно в случае, если они различаются).

В код MainPage.xaml.cs (или туда куда нам нужно) также добавляем пространство имен:

using Microsoft.WindowsAzure.MobileServices;


Объявляем коллекцию:

private MobileServiceCollection items;


и можно использовать следующие сниппеты (а можно написать свои).

Для добавления элемента в таблицу:

            mydemotable item = new mydemotable
            {
                surname = "Skywalker",
                salary = 2244
            };
            await App.MobileService.GetTable().InsertAsync(item);


Для редактирования:

      items = await demoTable
          .Where(y => y.salary > 100).ToCollectionAsync();     
            mydemotable editem;
            editem = items.FirstOrDefault(x => x.surname == "Weider");
            if (editem != null)
            {
                editem.surname = "Yoda";
                editem.salary = 555;
                await App.MobileService.GetTable().UpdateAsync(editem);
            }


Можно добавить в XAML какой-нибудь элемент. Например, такой вот простой ListView с привязкой данных:

 
     
         
             
                 
                 
             
         
     


И заполнить его:

            MobileServiceInvalidOperationException exception = null;
            try
            {
                items = await App.MobileService.GetTable()
                    .Where(todoItem => todoItem.salary > 100)
                    .ToCollectionAsync();
            }
            catch (MobileServiceInvalidOperationException ex)
            {
                exception = ex;
            }

            if (exception == null) myListView.DataContext = items;

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


Это все хорошо, но каждый раз тянуть данные из интернета не хочется. Обычно разработчики создают локальную базу и проводят синхронизацию. Этот способ довольно просто реализуется в Mobile Apps.

Необходимо в NuGet найти и дополнительно установить System.Data.SQLite и Microsoft.Azure.Mobile.Client.SQLiteStore
Кроме того установить SQLite SDK и добавить ссылку на SQLite для UWP

В файле App.xaml.cs никаких изменений производить не требуется.
В MainPage.xaml.cs добавляем два пространства имен:

using Microsoft.WindowsAzure.MobileServices.SQLiteStore;  
using Microsoft.WindowsAzure.MobileServices.Sync;         


и одно объявление:

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


Добавляем таск для инициализации локальной базы:

        private async Task InitLocalStoreAsync()
        {
            if (!App.MobileService.SyncContext.IsInitialized)
            {
                var store = new MobileServiceSQLiteStore("localstore.db");
                store.DefineTable();
                await App.MobileService.SyncContext.InitializeAsync(store);
            }
        }


Его запускаем после запуска приложения.

Для отправки данных в базу Azure можем использовать:

await App.MobileService.SyncContext.PushAsync();


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

Для того чтобы обновить полностью локальную таблицу:

await demoTable.PullAsync(null, demoTable.CreateQuery());


Перед pull необходимо выполнять push, для того чтобы была уверенность в том что обе базы имеют одинаковые отношения.

Имеется возможность инкрементального обновления локальной таблицы, задав первым параметром id запроса, а вторым параметром сам запрос:

await demoTable.PullAsync("mydemotableSkywalker", demoTable.Where(u => u.surname=="Skywalker"));


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

Очистка локальной таблицы возможна с помощью:

await demoTable.PurgeAsync();


Очистку таблицы необходимо производить перед обновлением локальной базы, если были удалены какие-то строки в облачной базе и при этом вы не используете soft delete.

Пара полезных ссылок:
Offline Data Sync in Azure Mobile Apps

Using offline data sync in Mobile Services
В этой статье вы можете прочитать про синхронизацию оффлайн и онлайн баз в Azure Mobile Services. Этот сервис является предшественником Mobile Apps и можно найти много общего.

Редактирование данных в облачной базе


Если для просмотра данных в таблице можно воспользоваться простыми таблицами, то редактировать их можно с помощью Visual Studio. Для того чтобы открыть базу в ней можно зайти в базы данных SQL и выбрать в Tools «открыть в Visual Studio»

d0106c67eda34e8f857d6fe9b445dc4a.PNG

Для того чтобы открылось, необходимо нажать ссылку «настройка брандмауэра» и внести отображаемый IP адрес в правило (это то адрес, с которого вы сейчас подключены)

0271b6c5140c49bc843d917902e4e5ec.PNG

© Habrahabr.ru