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

Create project

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

Add local database

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

Add table

Для простейшего примера нам будет достаточно таблицы с 5 столбцами:

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

В итоге выглядит это примерно так: DB table

Теперь надо перестроить проект и на этом 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.

Create 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