Microsoft Azure Mobile Services – краткое руководство по использованию. Часть 2.

Для изучения материала изложенного в данной статье вам потребуется подписка на облачную платформу Microsoft Azure. Вы можете получить ее бесплатно:

Хранение данных в Mobile Services

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

Загрузите C# версию GetStartedWithData Developer Code Samples (рисунок 1).

Рис. 1. Developer Code Samples

Откройте проект в Visual Studio 2012 Express для Windows 8.

Откройте MainPage.xaml.cs.

Обратите внимание на то, что объекты TodoItem хранятся в памяти - ObservableCollection<TodoItem>.

Нажмите F5.

Введите текст в Insert a TodoItem и нажмите Save (рисунок 2).

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

Сохраненный текст отображается в Queryandupdatedata.

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

Установите Mobile Services SDK.

В Visual Studio в Project нажмите AddReference, разверните Windows, нажмите Extensions, отметьте WindowsAzureMobileServicesManagedClient и нажмите OK (рисунок 3).

Рис. 3. Добавление зависимостей в приложение

Нажатие на кнопку добавит клиент мобильных сервисов в проект.

В MainPage.xaml.cs и App.xaml.cs добавьте следующий код:

using Microsoft.WindowsAzure.MobileServices;

На портале управления перейдите в MobileServices и выберите ваш мобильный сервис.

Перейдите на вкладку Dashboard и запишите SiteURL, а также, нажав Managekeys запишите Applicationkey(рисунок 4).

Рис. 4. Портал управления Microsoft Azure

В Visual Studio раскомментируйте в файле App.xaml.cs определяющий переменную MobileService код и вставьте соответствующие значения URL и application, скопированные с портала управления, в конструктор MobileServiceClient.

В MainPage.xaml.cs закомментируйте строку, определяющую коллекцию items и раскомментируйте следующие строки кода:

private MobileServiceCollectionView<TodoItem> items; private IMobileServiceTable<TodoItem> todoTable = App.MobileService.GetTable<TodoItem>();

В этом коде создается коллекция для мобильных сервисов (item) и проекси-класс для таблицы TodoItem (todoTable).

В методе InsertTodoItem удалите определяющую свойство TodoItem.Id строку, добавьте модификатор async , и раскомментируйте строку кода:

await todoTable.InsertAsync(todoItem);

В методе RefreshTodoItems раскомментируйте:

items = todoTable.ToCollectionView();

Этот код определяет привязку к коллекции сущностей в todoTable, содержащую все записи, возвращаемые мобильным сервисом.

В метод UpdateCheckedTodoItem добавьте модификатор async modifier to и раскомментируйте:

await todoTable.UpdateAsync(item);

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

Запуск приложения

В Visual Studio нажмите F5.

Введите текст в InsertaTodoItem и нажмите Save. Это приведет к добавлению сущности мобильному сервису.

На портале управления перейдите на MobileServices и выберите ваш мобильный сервис.

Перейдите на вкладку Data и нажмите Browse (рисунок 5).

Рис. 5. Просмотр данных в таблице TodoItem

Замените в файле MainPage.xaml.cs метод RefreshTodoItems на следующий код, который будет осуществлять фильтрацию:

private void RefreshTodoItems() { // Запрос отфильтровывает сущности items = todoTable .Where(todoItem => todoItem.Complete == false) .ToCollectionView(); ListItems.ItemsSource = items; }

В приложении отметьте одну из сущностей в списке и нажмтие Refresh.

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

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

Проверка данных

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

На портале управления перейдите на MobileServices и выберите ваше приложение (рисунок 6).

Рис. 6. Портал управления Microsoft Azure

На вкладке Data нажмите на таблицу TodoItem (рисунок 7).

Рис. 7. Портал управления Microsoft Azure

Нажмите Script и выберите Insert (рисунок 8).

Рис. 8. Портал управления Microsoft Azure

Замените скрипт на код ниже и нажмите Save.

function insert(item, user, request) { if (item.text.length > 10) { request.respond(statusCodes.BAD_REQUEST, 'Text length must be under 10'); } else { request.execute(); } }

В скрипте проверяется длина значения свойства TodoItem.text и генерируется ошибка в том случае, если она превышает 10 символов, иначе выполняется метод execute.

Обновление клиента

Откройте в Visual Studio 2012 Express для Windows 8 проект из предыдущей части.

Запустите приложение, нажав F5 key и попробуйте ввести строку длиннее 10 символов в поле InsertaTodoItem, после чего нажмите Save.

Будет выброшено исключение MobileServiceInvalidOperationException, так как код ответа с сервера будет 400 (Bad Request) .

Вставьте в MainPage.xaml.cs следующий код:

using Windows.UI.Popups;

Замените метод InsertTodoItem:

private async void InsertTodoItem(TodoItem todoItem) { // Происходит вставка в БД нового TodoItem. // По завершению операции сущность добавляется в CollectionView try { await todoTable.InsertAsync(todoItem); items.Add(todoItem); } catch (MobileServiceInvalidOperationException e) { MessageDialog errormsg = new MessageDialog(e.Response.Content, string.Format("{0} (HTTP {1})", e.Response.StatusDescription, e.Response.StatusCode)); var ignoreAsyncOpResult = errormsg.ShowAsync(); } }

В этом коде обрабатывается исключение MobileServiceInvalidOperationException,выдавая ошибку во всплывающем окне.

Добавление даты к сущности

В Scripts на портале управления, замените скрипт Insert и нажмите Save.

function insert(item, user, request) { if (item.text.length > 10) { request.respond(statusCodes.BAD_REQUEST, 'Text length must be under 10'); } else { item.createdAt = new Date(); request.execute(); } }

Запустите приложение, нажав F5, после чего введите строку из более чем 10 символов в поле InsertaTodoItem и нажмите Save.

Обратите внимание, что нового поля даты в интерфейсе нет.

На портале управления на вкладке Browse выберите таблицу todoitem.

В базе столбец createdAt есть, и вставленная последней сущность имеет значение даты.

Обновление интерфейса приложения

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

Замените в MainPage.xaml.cs класс TodoItem:

public class TodoItem { public int Id { get; set; } [DataMember(Name="text")] public string Text { get; set; } [DataMember(Name="complete")] public bool Complete { get; set; } [DataMember(Name="createdAt")] public DateTime? CreatedAt { get; set; } }

Новое определение класса содержит nullable DateTime.

Атрибут DataMemberAttribute сообщает клиенту о том, что необходимо соотнести новое свойство CreatedAt со столбцом createdAt из таблицы TodoItem.

Добавьте под элементом CheckBoxComplete в файле MainPage.xaml следующий код, который отобразит в текстовом поле новое поле CreatedAt:

Нажмите F5 для запуска приложения.

Замените RefreshTodoItems:

private void RefreshTodoItems() { // В этом запросе отфильтровываются “завершенные” // задачи и сущности без даты items = todoTable .Where(todoItem => todoItem.Complete == false && todoItem.CreatedAt != null) .ToCollectionView(); ListItems.ItemsSource = items; }

Запустите приложение. Все сущности с неопределенным значением даты исчезли из списка в интерфейсе.