В блоге 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