Оглавление:
Часть 1. Введение.
Часть 2. Хранение данных в Mobile Services
Часть 3. Аутентификация.
Часть 4. Push-уведомления.


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

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

clip_image002

Рис. 1. Developer Code Samples

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

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

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

Нажмите F5.

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

clip_image004

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

Сохраненный текст отображается в Query and update data.

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

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

В Visual Studio в Project нажмите Add Reference, разверните Windows, нажмите Extensions, отметьте Windows Azure Mobile Services Managed Client и нажмите OK(рисунок 3).

clip_image006

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

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

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

using Microsoft.WindowsAzure.MobileServices;

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

Перейдите на вкладку Dashboard и запишите Site URL, а также, нажав Manage keys запишите Application key(рисунок 4).

clip_image008

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

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

В 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.

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

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

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

clip_image010

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

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

private void RefreshTodoItems()

{

// Запрос отфильтровывает сущности

items = todoTable

.Where(todoItem => todoItem.Complete == false)

.ToCollectionView();

ListItems.ItemsSource = items;

}

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

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

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

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

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

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

clip_image012

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

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

clip_image014

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

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

clip_image016

Рис. 8. Портал управления Windows 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 символов в поле Insert a TodoItem и нажмите 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:

<TextBlock Name="WhenCreated" Text="{Binding CreatedAt}" VerticalAlignment="Center"/>

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

Замените RefreshTodoItems:

private void RefreshTodoItems()

{

// В этом запросе отфильтровываются “завершенные”

// задачи и сущности без даты

items = todoTable

.Where(todoItem => todoItem.Complete == false

&& todoItem.CreatedAt != null)

.ToCollectionView();

ListItems.ItemsSource = items;

}

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