Лёгкий способ работы с БД в WP7 Mango

В блоге TNT for the brain есть интересная статья по работе с  базой данных в WP7 для ленивых. Хотелось бы её перепостить.

На сайте MSDN есть статьи и пошаговые инструкции по созданию и работе с БД в 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:TestsMyDB.sdf /code:D:TestsMyDB.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 на пространство имён нашего проекта и удалить два следующих метода:

   1: public MyDBContext(System.Data.IDbConnection connection) : 

   2:         base(connection, mappingSource) 

   3: { 

   4:     OnCreated(); 

   5: } 

и

   1: public MyDBContext(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) : 

   2:         base(connection, mappingSource) 

   3: { 

   4:     OnCreated(); 

   5: } 

так как интерфейс IDbConnection не поддерживается телефоном.

Следующим шагом мы создадим промежуточный Helper — класс для большего удобства работы с базой данных. При таком подходе в MyDB.cs вносить изменения больше не придётся.

   1: public class DBHelper 

   2: { 

   3:     private const string ConnectionString = @"isostore:/ReaderDB.sdf"; 

   4:   

   5:     /// <summary> 

   6:     /// Создание БД в изолированном хранилище. 

   7:     /// </summary> 

   8:     public static void CreateDatabase() 

   9:     { 

  10:         using (var context = new MyDBContext(ConnectionString)) 

  11:         { 

  12:             if (!context.DatabaseExists()) 

  13:             { 

  14:                 // create database if it does not exist 

  15:                 context.CreateDatabase(); 

  16:             } 

  17:         } 

  18:     } 

  19:   

  20:     /// <summary> 

  21:     /// Удаление БД из изолированного хранилища. 

  22:     /// </summary> 

  23:     public static void DeleteDatabase() 

  24:     { 

  25:         using (var context = new MyDBContext(ConnectionString)) 

  26:         { 

  27:             if (context.DatabaseExists()) 

  28:             { 

  29:                 // delete database if it exist 

  30:                 context.DeleteDatabase(); 

  31:             } 

  32:         } 

  33:     } 

  34:   

  35:     /// <summary> 

  36:     /// Добавляет статью в БД. 

  37:     /// </summary> 

  38:     /// <param name="post"></param> 

  39:     public static void AddPost(Post post) 

  40:     { 

  41:         using (var context = new MyDBContext(ConnectionString)) 

  42:         { 

  43:             if (context.DatabaseExists()) 

  44:             { 

  45:                 context.Posts.InsertOnSubmit(post); 

  46:                 context.SubmitChanges(); 

  47:             } 

  48:         } 

  49:     } 

  50:   

  51:     /// <summary> 

  52:     /// Получает список статей из БД. 

  53:     /// </summary> 

  54:     /// <returns>Список статей.</returns> 

  55:     public static IList<Post> GetPosts() 

  56:     { 

  57:         IList<Post> posts = new List<Post>(); 

  58:   

  59:         using (var context = new MyDBContext(ConnectionString)) 

  60:         { 

  61:             posts = (from emp in context.Posts select emp).ToList(); 

  62:         } 

  63:         return posts; 

  64:     } 

  65: } 

Теперь в коде можно просто вызывать статичные методы DBHelper для различного взаимодействия с БД! Например, будем создавать БД (если она отсутствует) при загрузке страницы.

   1: private void LayoutRoot_Loaded(object sender, RoutedEventArgs e) 

   2: { 

   3:     DBHelper.CreateDatabase(); 

   4: }

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;"; 

Максимальный размер буфера
Указывается в килобайтах, в пределах от 384 до 5120.

string ConnectionString = @"Data Store = 'isostore:/ReaderDB.sdf'; Max Buffer Size = 2048;"; 

Культура
Параметр культуры указывается в виде «язык-Страна», например, «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

Добавить комментарий