Лёгкий способ работы с БД в 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