Лёгкий способ работы с БД в WP7 Mango
Содержание
В блоге TNT for the brain есть интересная статья по работе с базой данных в WP7 для ленивых. Хотелось бы её перепостить.
На сайте MSDN есть [статьи](https://msdn.microsoft.com/ru-ru/windowsphone/hh425066#mark_15 и пошаговые инструкции по созданию и работе с БД в WP, но @ponfius и @kin9pin нашли более простой выход. С этого момента пойдёт перепост статьи.
1. Создаём структуру базы данных
Для начала нам понадобится база данных в формате .sdf. Как её создать? Очень просто!
Идём в Visual Studio, создаём новый проект (например, Windows Forms Application)

Добавляем новый элемент в наш проект типа Local Database

Жмём Next и Finish. Далее идём в View и выбираем Server Explorer (Ctrl + W, L).
В разделе Data Connections мы видим нашу только что добавленную базу данных. Теперь мы можем создать структуру нашей будущей базы данных. Начнем с того, что добавим одну таблицу.

Для простейшего примера нам будет достаточно таблицы с 5 столбцами:
ID(идентификатор постов, всегда уникальный, автоматически увеличивается на 1 и служит первичным ключом);Title(название поста, текст, не больше 150 символов);Description(описание поста, текст, не больше 1000 символов);Date(дата и время создания поста, типdatetime);Link(ссылка на полную версию поста, текст, не длиннее 100 символов).
В итоге выглядит это примерно так:

Теперь надо перестроить проект и на этом Visual Studio можно на некоторое время закрыть и расслабиться: самая сложная часть осталась позади :). В папке с вашим проектом появился файл MyDB.sdf. Дальнейшая работа будет проходить именно с ним, так что весь солюшн, кроме MyDB.sdf можно удалить.
Файл MyDB.sdf я положил в D:\Tests для большего удобства в выполнении следующего шага.
2. Создаём DataContext для работы с БД
Что такое DataContext? Это некоторый класс, который служит нам для работы с БД и выполнения основных CRUD операций (create, read, update, delete). Для того, чтобы его создать нужно открыть командную строку Visual Studio:
Пуск->Все программы->Microsoft Visual Studio 2010->Visual Studio Tools->Visual Studio Command Prompt
В командной строке с помощью утилиты SQLmetal мы сгенерируем DataContext для нашей базы данных MyDB.sdf.
sqlmetal D:\Tests\MyDB.sdf /code:D:\Tests\MyDB.cs /language:csharp /namespace:DBDemo /context:MyDBContext /pluralize
В этой команде мы указали путь к нашей БД и путь, куда поместить наш DataContext, выбрали язык C#, указали название пространства имён и имя DataContext.

Теперь в нашей папке Tests лежит файл MyDB.cs, который и является DataContext нашей БД.
3. Пример использования
Давайте создадим новый проект под WP7 (обязательно укажите Windows Phone 7.1, т.к. поддержка баз данных появилась только в WP7 Mango).
В проект добавляем наш MyDB.cs, в референсы добавляем System.Data.Linq.
Единственное, что придется изменить в MyDB.cs - это namespace на пространство имён нашего проекта и удалить два следующих метода:
public MyDBContext(System.Data.IDbConnection connection) :
base(connection, mappingSource)
(
OnCreated();
)
и
public MyDBContext(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) :
base(connection, mappingSource)
(
OnCreated();
)
так как интерфейс IDbConnection не поддерживается телефоном.
Следующим шагом мы создадим промежуточный Helper - класс для большего удобства работы с базой данных. При таком подходе в MyDB.cs вносить изменения больше не придётся.
public class DBHelper
{
private const string ConnectionString = @"isostore:/ReaderDB.sdf";
/// <summary>
/// Создание БД в изолированном хранилище.
/// </summary>
public static void CreateDatabase()
{
using (var context = new MyDBContext(ConnectionString))
{
if (!context.DatabaseExists())
{
// create database if it does not exist
context.CreateDatabase();
}
}
}
/// <summary>
/// Удаление БД из изолированного хранилища.
/// </summary>
public static void DeleteDatabase()
{
using (var context = new MyDBContext(ConnectionString)
{
if (context.DatabaseExists())
{
// delete database if it exist
context.DeleteDatabase();
}
}
}
/// <summary>
/// Добавляет статью в БД.
/// </summary>
/// <param name="post"></param>
public static void AddPost(Post post)
{
using (var context = new MyDBContext(ConnectionString))
{
if (context.DatabaseExists())
{
context.Posts.InsertOnSubmit(post);
context.SubmitChanges();
}
}
}
/// <summary>
/// Получает список статей из БД.
/// </summary>
/// <returns>Список статей.</returns>
public static IList<Post> GetPosts()
{
IList<Post> posts = new List<Post>();
using (var context = new MyDBContext(ConnectionString))
{
posts = (from emp in context.Posts select emp).ToList();
}
return posts;
}
}
Теперь в коде можно просто вызывать статичные методы DBHelper для различного взаимодействия с БД! Например, будем создавать БД (если она отсутствует) при загрузке страницы.
private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
{
DBHelper.CreateDatabase();
}
4. Немного о ConnectionString
В общем случае ConnectionString - некоторая строка, в которой могут быть указаны различные параметры для подключения к базе данных.
Источник данных
Источник данных - параметр по-умолчанию, то есть вы можете не указывать свойство Data Source. База данных может располагаться как в изолированном хранилище, так и в директории с данными приложения.
string ConnectionString = @"isostore:/ReaderDB.sdf";
string ConnectionString = @"appdata:/ReaderDB.sdf";
string ConnectionString = @"DataSource = 'isostore:/ReaderDB.sdf';";
string ConnectionString = @"DataSource = 'appdata:/ReaderDB.sdf';";
Пароль
Пароль используется чтобы зашифровать базу данных при создании и так же его необходимо указывать при подключении к ней. Максимальная длина пароля - 40 символов.
string ConnectionString = @"Data Source = 'isostore:/ReaderDB.sdf'; Password = 'mypassword';";
Режим
Существуют 4 режима открытия БД (Read Write,Read Only, Exculsive и Shared Read), которые обозначают вид доступа.
// Позволяет нескольким процессам читать и писать в БД одновременно. Это режим по-умолчанию.
string ConnectionString = @"Data Store = 'isostore:/ReaderDB.sdf'; File Mode = 'Read Write';";
// Разрешает процессам производить только чтение из БД.
string ConnectionString = @"Data Store = 'isostore:/ReaderDB.sdf'; File Mode = 'Read Only';";
// Разрешает только одному процессу читать и писать в БД.
string ConnectionString = @"Data Store = 'isostore:/ReaderDB.sdf'; File Mode = 'Exclusive';";
// Разрешает всем процессам читать из БД, но только один может писать.
string ConnectionString = @"Data Store = 'isostore:/ReaderDB.sdf'; File Mode = 'Shared Read';";
Максимальный размер БД
Размер указывается в мегабайтах, в пределах от 32 до 512.
string ConnectionString = @"Data Store = 'isostore:/ReaderDB.sdf'; Max Database Size = 128;";
Культура
Параметр культуры указывается в виде язык-Страна, например, ru-RU для русского языка в России.
string ConnectionString = @"Data Store = 'isostore:/ReaderDB.sdf'; Culture Identifier = ru-RU;";
Чувствительность к регистру
В параметрах можно так же указать, будет ли база данных чувствительна к регистру.
string ConnectionString = @"Data Store = 'isostore:/ReaderDB.sdf'; Case Sensitive = true;";
Заключение
На этом, как говориться по новостям – конец перепоста =)
Как можно заметить, работа в БД в WP7 Mango не такая уж и сложная!
По материалам TNT for the brain