Локальные базы данных
Цель работы: освоить технологию работы с локальными базами данных на Windows Phone
MVVM-приложение для Windows Phone, реализующее работу с локальной базой данных
В этой лабораторной работе мы рассмотрим приложение, описанное в материале "Как создать MVVM-приложение для Windows Phone, работающее с локальной базой данных" (http://msdn.microsoft.com/library/windowsphone/develop/hh286405%28v=vs.105%29.aspx). Загрузить проект приложения можно здесь: "Пример работы с локальной базой данных" (http://code.msdn.microsoft.com/Local-Database-Sample-57b1614c).
В проекте приложения, рис. 35.1., присутствует несколько страниц, это главная страница – MainPage.xaml, и страница, которая используется для добавления новых объектов (задач, в контексте приложения) в базу данных. Это – страница NewTaskPage.xaml.
В папке Model расположен файл ToDoDataModel.cs. Это, в терминологии MVVM, модель данных, с которой работает приложение. Модель представления описана в файле ToDoViewModel.cs, который расположен в папке ViewModel.
Рассмотрим особенности реализации данного приложения. Стоит отметить, что ключевым в работе с базами данных для Windows Phone, является класс System.Data.Linq.DataContext (http://msdn.microsoft.com/en-us/library/windowsphone/develop/system.data.linq.datacontext%28v=vs.105%29.aspx). Он служит посредником между базой данных и Windows Phone-приложением. Не стоит путать его со свойством DataContext объекта FrameworkElement (http://msdn.microsoft.com/en-us/library/windowsphone/develop/system.windows.frameworkelement.datacontext%28v=vs.105%29.aspx), последний используется в системе привязки данных, здесь же мы говорим о взаимодействии с базой данных.
SDF-файлы локальных баз данных, используемых приложениями для Windows Phone, располагаются в локальных папках приложений, а значит, база данных приложения доступна только ему. На Windows Phone не предусмотрено чего-то вроде постоянно исполняющегося сервера баз данных – работа с базой осуществляется только в процессе приложения. Для работы с базами данных используется Linq to SQL, Transact-SQL не поддерживается.
Контекст данных, который используется для вывода информации на главной странице приложения, устанавливается на статическую переменную ViewModel типа ToDoViewModel, объявленную в классе App. В этом же классе, в конструкторе (Листинг 35.1.), готовится строка соединения c базой данных(connection string). Она указывает на локальный файл базы данных. Схема "isostore:" указывает на локальную папку приложения, где и будет храниться файл базы данных. Структура строки соединения представляет собой пару вида "ключ=значение".
using System.Windows; using System.Windows.Navigation; using Microsoft.Phone.Controls; using Microsoft.Phone.Shell; // Директивы using LocalDatabaseSample.Model; using LocalDatabaseSample.ViewModel; namespace sdkLocalDatabaseCS { public partial class App : Application { // Статическая переменная ViewMode для использования в приложении. private static ToDoViewModel viewModel; public static ToDoViewModel ViewModel { get { return viewModel; } } /// <summary> /// Конструктор объекта Application. /// </summary> public App() { // Укажем строку соединения с локальной базой данных. string DBConnectionString = "Data Source=isostore:/ToDo.sdf"; // Если база данных не существует – создадим её. using (ToDoDataContext db = new ToDoDataContext(DBConnectionString)) { if (db.DatabaseExists() == false) { // Создание локальной базы данных. db.CreateDatabase(); // Предварительное заполнение категорий базы данных. db.Categories.InsertOnSubmit(new ToDoCategory { Name = "Home" }); db.Categories.InsertOnSubmit(new ToDoCategory { Name = "Work" }); db.Categories.InsertOnSubmit(new ToDoCategory { Name = "Hobbies" }); // Сохранение категорий. db.SubmitChanges(); } } // Создание объекта viewModel с использованием базы данных. viewModel = new ToDoViewModel(DBConnectionString); // Выполнение запроса к базе данных и загрузка коллекций, используемых при привязке данных. viewModel.LoadCollectionsFromDatabase(); }Листинг 35.1. Фрагмент файла App.xaml.cs
При первом запуске приложения файла базы данных не существует, поэтому, если соответствующая проверка на это указывает, выполняется создание базы данных по указанной строке соединения. Здесь используется объект типа ToDoDataContext, то есть – класс, являющийся моделью данных приложения. Этот класс, как мы увидим ниже, он унаследован от класса System.Data.Linq.DataContext, то есть, он может пользоваться его возможностями, среди которых – и создание базы данных. В данном случае метод CreateDatabase() – это метода родительского класса. После создания базы данных выполняется её первоначальное заполнение. Это реализовано с помощью метода InsertOnSubmit() объекта InsertOnSubmit. Данный объект – System.Data.Linq.Table – то есть – таблица базы данных, определен в классе ToDoDataContext.
После первоначального заполнения база данных сохраняется.
Если база данных уже существовала (или если она была уже создана, и та и другая ситуации обрабатываются одинаково), выполняется создание новой модели представления viewModel типа ToDoViewModel с указанием строки соединения с базой. Эта закрытая статическая переменная, в итоге, используется, через открытую переменную ViewModel, в качестве контекста данных главной страницы приложения.
На завершающем этапе инициализации происходит вызов метода модели представления LoadCollectionsFromDataBase. Здесь выполняются запросы к базе для заполнения коллекций, определенных в модели представления и используемых при привязке данных.
Главная страница приложения MainPage.xaml и страница NewTaskPage.xaml, взаимодействуют с моделью представления, во-первых, с помощью системы привязки данных, во-вторых – с помощью вызовов некоторых методов модели представления из кода. В частности, страница NewTaskPage вызывает метод модели представления AddToDoItem, передавая ему данные о новом элементе, который нужно создать, страница MainPage вызывает метод DeleteToDoItem.