Опубликован: 02.08.2013 | Доступ: свободный | Студентов: 464 / 16 | Длительность: 18:38:00
Специальности: Программист
Самостоятельная работа 12:

Разработка для Windows Azure

< Лекция 25 || Самостоятельная работа 12: 1234 || Самостоятельная работа 13 >

Работа с мобильной службой Windows Azure реализована в коде файла MainPage.xaml.cs, его код приведен в Листинге 39.2. Обратите внимание на комментарии к коду, поясняющие его фрагменты.

using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using Microsoft.WindowsAzure.MobileServices;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using my_notes.Resources;

namespace my_notes
{
    //Объектное представление записи таблицы базы данных
    public class TodoItem
    {
        public int Id { get; set; }

        [JsonProperty(PropertyName = "text")]
        public string Text { get; set; }

        [JsonProperty(PropertyName = "complete")]
        public bool Complete { get; set; }
    }

    public partial class MainPage : PhoneApplicationPage
    {
        // MobileServiceCollectionView реализует интерфейс ICollectionView 
(это удобно для организации привязки к списку) и 
        // интегрирован с вашей мобильной службой, что упрощает привязку данных к элементу управления ListView
        private MobileServiceCollection<TodoItem, TodoItem> items;
        //Ссылка на таблицу в базе данных с указанием типа элемента
        private IMobileServiceTable<TodoItem> todoTable = App.MobileService.GetTable<TodoItem>();

        // Конструктор
        public MainPage()
        {
            InitializeComponent();
        }
        //Асинхронный метод
        private async void InsertTodoItem(TodoItem todoItem)
        {
            // Этот код выполняет вставку в базу данных нового элемента типа TodoItem. 
Когда операция завершается
            // и мобильная служба присваивает записи Id, элемент добавляется в CollectionView
            await todoTable.InsertAsync(todoItem);
            items.Add(todoItem);
        }
        //Асинхронный метод
        private async void RefreshTodoItems()
        {
            // Этот код обновляет записи в списке, выполняя запрос к таблице TodoItems.
            // Благодаря запросу "завершенные" дела не выводятся
            try
            {
                //Получаем из таблицы записи с флагом Complete, установленным в значение false
                items = await todoTable
                    .Where(todoItem => todoItem.Complete == false)
                    .ToCollectionAsync();
            }
            catch (MobileServiceInvalidOperationException e)
            {
                //Сообщение, выводимое при возникновении в ходе загрузки ошибки
                MessageBox.Show(e.Message, "Error loading items", MessageBoxButton.OK);
            }

            ListItems.ItemsSource = items;
        }
        //Асинхронный метод
        private async void UpdateCheckedTodoItem(TodoItem item)
        {
            // Этот код использует сведения о выполненной задаче TodoItem и обновляет базу данных. 
            // После ответа MobileService элемент удаляется из списка 
            await todoTable.UpdateAsync(item);
            items.Remove(item);
        }
        //Обработчик нажатия на кнопку обновления списка
        private void ButtonRefresh_Click(object sender, RoutedEventArgs e)
        {
            RefreshTodoItems();
        }
        //Обработчик нажатия на кнопку сохранения элемента
        private void ButtonSave_Click(object sender, RoutedEventArgs e)
        {
            var todoItem = new TodoItem { Text = TodoInput.Text };
            InsertTodoItem(todoItem);
        }
        //Обработчик установки флага, говорящего о завершении "дела"
        private void CheckBoxComplete_Checked(object sender, RoutedEventArgs e)
        {
            CheckBox cb = (CheckBox)sender;
            TodoItem item = cb.DataContext as TodoItem;
            item.Complete = true;
            UpdateCheckedTodoItem(item);
        }
        //Переопределенный метод, выполняющийся при переходе на страницу
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            //Обновление списка записей
            RefreshTodoItems();
        }
    }
}
Листинг 39.2. Код файла MainPage.xaml.cs

После того, как в App.xaml.cs мы подключились к мобильной службе, операции, которые касаются получения данных из таблицы базы данных, записи в базу, обновления записей, выполняются в привычном для C#-проекта стиле. Обратите внимание на то, что часть операций выполняется асинхронно – об асинхронности мы поговорим в дальнейшем, однако нужно отметить, что использование асинхронных методов обязательно для тех участков кода, где осуществляются операции, на выполнение которых может уйти достаточно много времени. Например, работа с мобильной службой через Интернет – это одна из таких операций. Мы не можем предсказать, как долго будут выполняться запросы к службе, поэтому выполнение подобных запросов в потоке пользовательского интерфейса недопустимо. Это приведет к тому, что интерфейс будет периодически отказываться реагировать на воздействия пользователя.

На странице MainPage.xaml имеется элемент управления LongListSelector с именем ListItems. Данные, соответствующие данным, хранящимся в таблице в мобильной службе, отображаются в этом списке с использованием механизма привязки данных. Для отображения данных используется шаблон (Листинг 39.3), который обеспечивает вывод флага, элемента CheckBox, с именем CheckBoxCompleted и описывает обработчик события, вызываемый при его изменении. Здесь применяется двусторонняя привязка данных. Шаблон обеспечивает и вывод текста с использованием привязки данных.

<phone:LongListSelector Grid.Row="4" Grid.ColumnSpan="2" 
Name="ListItems">
                <phone:LongListSelector.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <CheckBox Name="CheckBoxComplete" IsChecked="{Binding Complete, Mode=TwoWay}" 
Checked="CheckBoxComplete_Checked" 
Content="{Binding Text}" Margin="10,5" VerticalAlignment="Center"/>
                        </StackPanel>
                    </DataTemplate>
                </phone:LongListSelector.ItemTemplate>
            </phone:LongListSelector>
Листинг 39.3. Фрагмент кода страницы MainPage.xaml

Выводы

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

Задание

После того, как у вас имеется мобильная служба и вы понимаете работу кода, обеспечивающего взаимодействие приложения с мобильной службой, вы можете приступить к изучению других аспектов работы с Azure. Вы можете воспользоваться для этого ресурсами Центра экспертизы по Windows Azure (http://msdn.microsoft.com/ru-RU/ff380142).

Подумайте над тем, как вы можете использовать мобильные службы Azure в приложении, разработкой которого вы занимаетесь, рассмотрите возможности использования облачной базы данных, работы с Push-уведомлениями, аутентификации пользователей с использованием различных провайдеров аутентификации в применении к вашему приложению и подготовьте отчёт о проделанной работе.

Дополнительные материалы

К данной лабораторной работе подготовлено видеоприложение.

< Лекция 25 || Самостоятельная работа 12: 1234 || Самостоятельная работа 13 >