В превью версии Windows 8, нет прямого пути к доступу в отношении Базы данных (SQL Server, SQLCE) в  стиле Метро, мы можем использовать только локальное хранилище.Но все мы знаем,что,есть доступ к XML- и почему мы должны строить с нуля, когда у нас там много локальных реляционных баз данных ,таких как, например, VistaDb, Sqlite, SqlCE.

К счастью, есть одна библиотека opensource , которая поможет нам получить доступ к sqlite,которая называется sqlite-winrt на веб-узле CodePlex. Sqlite-winrt поможет нам создать и  получить доступ к базе данных MySQL ,которая хранится в наших локальных хранилищах данных, и мы можем легко восстановить или сохранить данных в БД sqlite, путем выполнения SQL.

Мы расстроим пример для демонстрации того, как можно построить Metro приложение, которое будет доступно через sqlite. Наше приложение будет создано для хранения и доступа к личным собраниям книг. Наша база данных будет иметь две таблицы, Категории и Книги для хранения категории книг и информации о книге.

Наши приложения смогут:

  1. Показать список  категорий книг
  2. Показать каждую категорию списка книг
  3. Создание новой категории
  4. Создание новой книги

Наш интерфейс приложения:

1-Й ЭТАП: Создайте новое приложение под названием MetroDbAccess и ссылку на библиотеку sqlite-winrt  (Sqlite.winmd). Для ссылки на библиотеки C++ wrapper,такие как sqlite-winrt, вы должны воспользоваться ссылкой C:Program Files (x86)Microsoft Visual Studio 11.0VCbinplatform.winmd перед ссылкой на оболочку библиотеки.

2-Й ЭТАП: Создание модели классов

public class Категории { public int Идентификатор {get; значение;} public string Name {get; значение;} public string Описание {get; значение;} } общественный класс, Книга, { public int Идентификатор {get; значение;} public string Name {get; значение;} public string Автор {get; значение;} public string Описание {get; значение;} общественная Категория {get; значение;} } class Category { public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } } public class Book { public int Id { get; set; } public string Name { get; set; } public string Author { get; set; } public string Description { get; set; } public Category Category { get; set; } }

MainPageViewModel класса, который используется для хранения данных для Mainpage.xaml.

3 СТУПЕНЬ: Измените Mainpage.xaml

<UserControl x:Class="MetroDbAccess.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/презентация" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/выражение/смесь/2008" xmlns:mc="http://schemas.openxmlformats.org/разметки-совместимость/2006" mc:Циклической="d" d:DesignHeight="768" d:DesignWidth 1366=""> <Grid x:Имя="LayoutRoot" Background="#FF0C0C0C" > <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Ширина="*"></ColumnDefinition> <ColumnDefinition Width="*"></ColumnDefinition> <ColumnDefinition Width="100"></ColumnDefinition> </Grid.ColumnDefinitions> <StackPanel Grid.Row="0" Grid.Column="0"> <TextBlock Text="список KASE Категории" FontSize="36" ></TextBlock> <ListView x:Имя="CategoryList" ItemsSource="{Обязательными Path=Категорий}" SelectionChanged="CategoryList_SelectionChanged" > <ListView.ItemTemplate> <DataTemplate> <StackPanel Ориентации="Горизонтальной"> <TextBlock Text="{Обязательными Path=Id}" FontSize="16"/> <TextBlock Text=" - " FontSize="16"/> <TextBlock Text="{Обязательными Path=Name}" FontSize="16"/> <TextBlock Text=" - " FontSize="16"/> <TextBlock Text="{Обязательными Path=Описание}" FontSize="16"/> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> </StackPanel> <StackPanel Grid.Row="0" Grid.Column="1" Маржа="10, 0, 0 ,0" Width="300" HorizontalAlignment="Left" > <TextBlock Text="Создать категорию" FontSize="32" ></TextBlock> <TextBlock Text="Имя:" FontSize="24" ></TextBlock> <Текстовое окно x:Name="CategoryNameTextBox"></TextBox> <TextBlock Text="Описание:" FontSize="24" ></TextBlock> <Текстовое окно x:Name="CategoryDescriptionTextBox"></TextBox> Кнопка <x:Имя="SaveCategoryButton" FontSize="24" Маржа="0, 10, 0, 0" Нажмите="SaveCategoryButton_Click">Сохранить</Button> </StackPanel> <StackPanel Grid.Row="1" Grid.Column="1" Маржа="10, 0, 0 ,0" Width="300" HorizontalAlignment="Left" > <TextBlock Text="Создать книгу" FontSize="32" ></TextBlock> <TextBlock x:Имя="ChosenCategoryTextBlock" Text="Категория:" FontSize="24" ></TextBlock> <TextBlock Text="название Книги:" FontSize="24" ></TextBlock> <Текстовое окно x:Name="NameTextBox"></TextBox> <TextBlock Text="Автор:" FontSize="24" ></TextBlock> <Текстовое окно x:Name="AuthorTextBox"></TextBox> <TextBlock Text="Описание:" FontSize="24" ></TextBlock> <Текстовое окно x:Name="DescriptionTextBox"></TextBox> Кнопка <x:Имя="SaveButton" FontSize="24" Маржа="0, 10, 0, 0" Нажмите="SaveButton_Click">Сохранить</Button> </StackPanel> <StackPanel Сетки.Row="1" Grid.Column="0"> <TextBlock Text="список Книг" FontSize="36" ></TextBlock> <ListView x:Имя="списка книг" > <ListView.ItemTemplate> <DataTemplate> <StackPanel Ориентации="Горизонтальной"> <TextBlock Text="{Обязательными Path=Id}" FontSize="16"/> <TextBlock Text=" - " FontSize="16"/> <TextBlock Text="{Обязательными Path=Name}" FontSize="16"/> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> </StackPanel> <StackPanel Grid.Column="2" Grid.Row="0"> Кнопка <x:Имя="InitDbButton" Нажмите кнопку="InitDbButton_Click">Init Базы данных</Button> Кнопка <x:Имя="ReplaceDbButton" Нажмите кнопку="ReplaceDbButton_Click" >Восстановить настройки по умолчанию, ДБ</Button> </StackPanel> </Grid> </UserControl> x:Class="MetroDbAccess.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="1366"> <Grid x:Name="LayoutRoot" Background="#FF0C0C0C" > <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"></ColumnDefinition> <ColumnDefinition Width="*"></ColumnDefinition> <ColumnDefinition Width="100"></ColumnDefinition> </Grid.ColumnDefinitions> <StackPanel Grid.Row="0" Grid.Column="0"> <TextBlock Text="Category list" FontSize="36" ></TextBlock> <ListView x:Name="CategoryList" ItemsSource="{Binding Path=Categories}" SelectionChanged="CategoryList_SelectionChanged" > <ListView.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Path=Id}" FontSize="16"/> <TextBlock Text=" - " FontSize="16"/> <TextBlock Text="{Binding Path=Name}" FontSize="16"/> <TextBlock Text=" - " FontSize="16"/> <TextBlock Text="{Binding Path=Description}" FontSize="16"/> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> </StackPanel> <StackPanel Grid.Row="0" Grid.Column="1" Margin="10, 0, 0 ,0" Width="300" HorizontalAlignment="Left" > <TextBlock Text="Create category" FontSize="32" ></TextBlock> <TextBlock Text="Name:" FontSize="24" ></TextBlock> <TextBox x:Name="CategoryNameTextBox"></TextBox> <TextBlock Text="Description:" FontSize="24" ></TextBlock> <TextBox x:Name="CategoryDescriptionTextBox"></TextBox> <Button x:Name="SaveCategoryButton" FontSize="24" Margin="0, 10, 0, 0" Click="SaveCategoryButton_Click">Save</Button> </StackPanel> <StackPanel Grid.Row="1" Grid.Column="1" Margin="10, 0, 0 ,0" Width="300" HorizontalAlignment="Left" > <TextBlock Text="Create book" FontSize="32" ></TextBlock> <TextBlock x:Name="ChosenCategoryTextBlock" Text="Category:" FontSize="24" ></TextBlock> <TextBlock Text="Book name:" FontSize="24" ></TextBlock> <TextBox x:Name="NameTextBox"></TextBox> <TextBlock Text="Author:" FontSize="24" ></TextBlock> <TextBox x:Name="AuthorTextBox"></TextBox> <TextBlock Text="Description:" FontSize="24" ></TextBlock> <TextBox x:Name="DescriptionTextBox"></TextBox> <Button x:Name="SaveButton" FontSize="24" Margin="0, 10, 0, 0" Click="SaveButton_Click">Save</Button> </StackPanel> <StackPanel Grid.Row="1" Grid.Column="0"> <TextBlock Text="Book list" FontSize="36" ></TextBlock> <ListView x:Name="BookList" > <ListView.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Path=Id}" FontSize="16"/> <TextBlock Text=" - " FontSize="16"/> <TextBlock Text="{Binding Path=Name}" FontSize="16"/> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> </StackPanel> <StackPanel Grid.Column="2" Grid.Row="0"> <Button x:Name="InitDbButton" Click="InitDbButton_Click">Init Database</Button> <Button x:Name="ReplaceDbButton" Click="ReplaceDbButton_Click" >Restore default DB</Button> </StackPanel> </Grid> </UserControl>

Есть некоторые обработчики событий, которые мы не создавали прежде, мы будем создавать их в последующих шагах.

4-Й ШАГ: Создание InitViewModel для создания БД sqlite,которая называется bookdb в LocalStorage, затем создаём таблицу Категорий, если она не существует, после этого, мы называем инструкции SQL для извлечения всех категорий и привязываем их к управлению CategoryList (управление ListView).

 частные void InitViewModel () { SQLite.Database дБ = new SQLite.Database ("bookdb"); / / создает файл базы данных в локальную папку app если (db.Ready) { var stmt = db.PrepareStatement ("CREATE TABLE, ЕСЛИ НЕ СУЩЕСТВУЕТ Категорий (id INTEGER PRIMARY KEY, имя, ТЕКСТ, ТЕКСТ описания)"); если (stmt.Execute ()) { //Upadate список категорий Model.Categories = new System.Collections.ObjectModel.ObservableCollection<Категория>(); stmt = db.PrepareStatement ("ВЫБЕРИТЕ идентификатор, имя, описание ОТ Категории"); в то время как (stmt.HasMore ()) { //Заполняем список категорий var id = stmt.ColumnAsIntAt (0); var catName = stmt.ColumnAsTextAt (1); var desc = stmt.ColumnAsTextAt (2); Model.Categories.Add (новая Категория () {Id = id, Name = catName, Описание = desc}); } } CategoryList.ItemsSource = Model.Categories; } } private void InitViewModel() { SQLite.Database db = new SQLite.Database("bookdb"); // creates the database file in the local app folder if (db.Ready) { var stmt = db.PrepareStatement("CREATE TABLE IF NOT EXISTS Categories (id INTEGER PRIMARY KEY,name TEXT, description TEXT)"); if (stmt.Execute()) { //Upadate the category list Model.Categories = new System.Collections.ObjectModel.ObservableCollection<Category>(); stmt = db.PrepareStatement("SELECT id, name, description FROM Categories"); while (stmt.HasMore()) { //Fill the category list var id = stmt.ColumnAsIntAt(0); var catName = stmt.ColumnAsTextAt(1); var desc = stmt.ColumnAsTextAt(2); Model.Categories.Add(new Category() { Id = id, Name = catName, Description = desc }); } } CategoryList.ItemsSource = Model.Categories; } }

5 ШАГ: Создание обработчика событий selectionchanged для CategoryList,который называется CategoryList_SelectionChanged, этот метод позволит нам применить GetBookByCategory,чтобы получить все книги из определенной категории, и связать список книг для управления списком книг.

 частные void CategoryList_SelectionChanged (object sender, SelectionChangedEventArgs e) { var index = CategoryList.SelectedIndex; ChosenCategoryTextBlock.Text = "Категория: " + Model.Categories [индекс] .Name; //Показать книги выбранной категории GetBookByCategory (Model.Categories [индекс] .Id); } частные void GetBookByCategory (int categoryId) { SQLite.Database дБ = new SQLite.Database ("bookdb"); / / создает файл базы данных в локальную папку app если (db.Ready) { var stmt = db.PrepareStatement ("ВЫБЕРИТЕ Books.id, Books.name, автор, Books.description, categoryid, Categories.Name, Categories.Description ИЗ Книг INNER JOIN Категории, ГДЕ Books.categoryid = Categories.id И Books.categoryid = " + categoryId.ToString ()); Model.Books = new System.Collections.ObjectModel.ObservableCollection<Книга>(); в то время как (stmt.HasMore ()) { var книга = новая Книга (); book.Id = stmt.ColumnAsIntAt (0); book.Name = stmt.ColumnAsTextAt (1); book.Author = stmt.ColumnAsTextAt (2); book.Description = stmt.ColumnAsTextAt (3); book.Category = новая Категория (); book.Category.Id = stmt.ColumnAsIntAt (4); book.Category.Name = stmt.ColumnAsTextAt (5); book.Category.Description = stmt.ColumnAsTextAt (6); Model.Books.Add (книга); } BookList.ItemsSource = Model.Books; } } private void CategoryList_SelectionChanged(object sender, SelectionChangedEventArgs e) { var index = CategoryList.SelectedIndex; ChosenCategoryTextBlock.Text = "Category: " + Model.Categories[index].Name; //Show ebooks of the selected category GetBookByCategory(Model.Categories[index].Id); } private void GetBookByCategory(int categoryId) { SQLite.Database db = new SQLite.Database("bookdb"); // creates the database file in the local app folder if (db.Ready) { var stmt = db.PrepareStatement("SELECT Books.id, Books.name, author, Books.description, categoryid, Categories.Name, Categories.Description FROM Books INNER JOIN Categories WHERE Books.categoryid = Categories.id AND Books.categoryid = " + categoryId.ToString()); Model.Books = new System.Collections.ObjectModel.ObservableCollection<Book>(); while (stmt.HasMore()) { var book = new Book(); book.Id = stmt.ColumnAsIntAt(0); book.Name = stmt.ColumnAsTextAt(1); book.Author = stmt.ColumnAsTextAt(2); book.Description = stmt.ColumnAsTextAt(3); book.Category = new Category(); book.Category.Id = stmt.ColumnAsIntAt(4); book.Category.Name = stmt.ColumnAsTextAt(5); book.Category.Description = stmt.ColumnAsTextAt(6); Model.Books.Add(book); } BookList.ItemsSource = Model.Books; } }

6 ШАГ: Нажмите кнопку создать обработчик событий для SaveCategoryButton контроля, чтобы создать новую Категорию.

 частные void SaveCategoryButton_Click (object sender, RoutedEventArgs e) { строка имя = CategoryNameTextBox.Text; string описание = CategoryDescriptionTextBox.Text; если (string.IsNullOrEmpty (имя)) return; SQLite.Database дБ = new SQLite.Database ("bookdb"); / / создает файл базы данных в локальную папку app если (db.Ready) { var stmt = db.PrepareStatement ("CREATE TABLE, ЕСЛИ НЕ СУЩЕСТВУЕТ Категорий (id INTEGER PRIMARY KEY, имя, ТЕКСТ, ТЕКСТ описания)"); если (stmt.Execute ()) { stmt = db.С ("INSERT INTO Категории (id, name, description) VALUES (NULL,?, ?)"); stmt.BindText (1, имя); stmt.BindText (2, описание); если (stmt.Execute ()) { InitViewModel (); } } } } private void SaveCategoryButton_Click(object sender, RoutedEventArgs e) { string name = CategoryNameTextBox.Text; string description = CategoryDescriptionTextBox.Text; if (string.IsNullOrEmpty(name)) return; SQLite.Database db = new SQLite.Database("bookdb"); // creates the database file in the local app folder if (db.Ready) { var stmt = db.PrepareStatement("CREATE TABLE IF NOT EXISTS Categories (id INTEGER PRIMARY KEY,name TEXT, description TEXT)"); if (stmt.Execute()) { stmt = db.PrepareStatement("INSERT INTO Categories (id, name, description) VALUES (NULL, ?, ?)"); stmt.BindText(1, name); stmt.BindText(2, description); if (stmt.Execute()) { InitViewModel(); } } } }

7 ШАГ: Нажмите кнопку создать обработчик событий для SaveButton контроля, чтобы создать новую Книгу.

 частные void SaveButton_Click (object sender, RoutedEventArgs e) { если (CategoryList.SelectedIndex < 0) { ChosenCategoryTextBlock.Text = "No категория выбрана!"; ChosenCategoryTextBlock.Foreground = new SolidColorBrush (Colors.Red); return; } SQLite.Database дБ = new SQLite.Database ("bookdb"); / / создает файл базы данных в локальную папку app если (db.Ready) { var stmt = db.PrepareStatement ("CREATE TABLE, ЕСЛИ НЕ СУЩЕСТВУЕТ Книг (id INTEGER PRIMARY KEY, имя, ТЕКСТ, автор, ТЕКСТ, ТЕКСТ описания, categoryid INTEGER)"); если (stmt.Execute ()) { stmt = db.PrepareStatement ("INSERT INTO Книги (id, название, автор, описание, categoryid) ЗНАЧЕНИЯ (NULL, ?, ?, ?, ?)"); stmt.BindText (1, NameTextBox.Text); stmt.BindText (2, AuthorTextBox.Text); stmt.BindText (3, DescriptionTextBox.Text); var catId = Model.Categories [CategoryList.SelectedIndex] .Id; stmt.BindInt (4, catId); если (stmt.Execute ()) { GetBookByCategory (catId); } } } private void SaveButton_Click(object sender, RoutedEventArgs e) { if (CategoryList.SelectedIndex < 0) { ChosenCategoryTextBlock.Text = "No category is selected!"; ChosenCategoryTextBlock.Foreground = new SolidColorBrush(Colors.Red); return; } SQLite.Database db = new SQLite.Database("bookdb"); // creates the database file in the local app folder if (db.Ready) { var stmt = db.PrepareStatement("CREATE TABLE IF NOT EXISTS Books (id INTEGER PRIMARY KEY, name TEXT, author TEXT, description TEXT, categoryid INTEGER)"); if (stmt.Execute()) { stmt = db.PrepareStatement("INSERT INTO Books (id, name, author, description, categoryid) VALUES (NULL, ?, ?, ?, ?)"); stmt.BindText(1, NameTextBox.Text); stmt.BindText(2, AuthorTextBox.Text); stmt.BindText(3, DescriptionTextBox.Text); var catId = Model.Categories[CategoryList.SelectedIndex].Id; stmt.BindInt(4, catId); if (stmt.Execute()) { GetBookByCategory(catId); } } }

8 ШАГ: Скопируйте ресурсы bookdb  для Локального Хранения данных при первом запуске. Теперь мы можем запустить проект,создавать в нём категории, или книги, но у нас остался вопрос,если мы хотим иметь некоторые данные по умолчанию в базе данных,для этого мы должны инициализировать базу данных при первом запуске, но это не очень хорошо, если у вас большая база данных для init, поэтому мы можем использовать более подходящий способ,чтобы скопировать существующие базы данных (как содержание ресурсов нашего проекта) для локального хранения при первом запуске приложения. Сначала вы должны добавить ваши базы данных по умолчанию в проект и установить для них действия,такие как “Содержание”.

Затем мы осуществим InitDb () метод для копирования ресурсов bookdb  для Локального Хранения данных с помощью LocalStorage API, предоставляемых WinRT.

 частные async void InitDb () { bool searchResult = false; StorageFolder storageFolder = ApplicationData.Current.LocalFolder; попробуйте { StorageFile sampleFile = ждут storageFolder.GetFileAsync ("bookdb"); searchResult = true; } вылов (FileNotFoundException) { } if (!searchResult) { var resourceLoader = new ResourceLoader (); var file = resourceLoader.GetFile ("bookdb"); var эксплуатация = ждут file.CopyAsync (ApplicationData.Current.LocalFolder, "bookdb"); } InitViewModel (); DataContext = Модель; } private async void InitDb() { bool searchResult = false; StorageFolder storageFolder = ApplicationData.Current.LocalFolder; try { StorageFile sampleFile = await storageFolder.GetFileAsync("bookdb"); searchResult = true; } catch (FileNotFoundException) { } if (!searchResult) { var resourceLoader = new ResourceLoader(); var file = resourceLoader.GetFile("bookdb"); var operation = await file.CopyAsync(ApplicationData.Current.LocalFolder, "bookdb"); } InitViewModel(); DataContext = Model; }

InitDb () будет вызывать метод для Главного конструктора и он будет проверять,существуют уже bookdb на LocalStorage, если нет,то InitDb () копирует ресурыв bookdb  для применения LocalStorage, прежде чем получить данные из базы данных.

Код ниже MainPage.xaml.cs (полный источник):

пространство имен MetroDbAccess { частичный класс MainPage { общественные MainPageViewModel Модель {get; значение;} общественные Главную () { InitializeComponent (); Модель = new MainPageViewModel (); InitDb (); } частные void SaveButton_Click (object sender, RoutedEventArgs e) { если (CategoryList.SelectedIndex < 0) { ChosenCategoryTextBlock.Text = "No категория выбрана!"; ChosenCategoryTextBlock.Foreground = new SolidColorBrush (Colors.Red); возвращение; } SQLite.Database дБ = new SQLite.Database ("bookdb"); / / создает файл базы данных в локальную папку app если (db.Ready) { var stmt = db.PrepareStatement ("CREATE TABLE, ЕСЛИ НЕ СУЩЕСТВУЕТ Книг (id INTEGER PRIMARY KEY, имя, ТЕКСТ, автор, ТЕКСТ, ТЕКСТ описания, categoryid INTEGER)"); если (stmt.Execute ()) { stmt = db.PrepareStatement ("INSERT INTO Книги (id, название, автор, описание, categoryid) ЗНАЧЕНИЯ (NULL, ?, ?, ?, ?)"); stmt.BindText (1, NameTextBox.Text); stmt.BindText (2, AuthorTextBox.Text); stmt.BindText (3, DescriptionTextBox.Text); var catId = Model.Categories [CategoryList.SelectedIndex] .Id; stmt.BindInt (4, catId); если (stmt.Execute ()) { GetBookByCategory (работающих); } } } } частные void SaveCategoryButton_Click (object sender, RoutedEventArgs e) { строка имя = CategoryNameTextBox.Text; строка описание = CategoryDescriptionTextBox.Text; если (string.IsNullOrEmpty (имя)) return; SQLite.Database дБ = new SQLite.Database ("bookdb"); / / создает файл базы данных в локальную папку app если (db.Ready) { var stmt = db.PrepareStatement ("CREATE TABLE, ЕСЛИ НЕ СУЩЕСТВУЕТ Категорий (id INTEGER PRIMARY KEY, имя, ТЕКСТ, ТЕКСТ описания)"); если (stmt.Execute ()) { stmt = db.PrepareStatement ("INSERT INTO Категории (id, name, description) VALUES (NULL,?, ?)"); stmt.BindText (1, имя); stmt.BindText (2, описание); если (stmt.Execute ()) { InitViewModel (); } } } } частные void InitViewModel () { SQLite.Database дБ = new SQLite.Database ("bookdb"); / / создает файл базы данных в локальную папку app если (db.Ready) { var stmt = db.PrepareStatement ("CREATE TABLE, ЕСЛИ НЕ СУЩЕСТВУЕТ Категорий (id INTEGER PRIMARY KEY, имя, ТЕКСТ, ТЕКСТ описания)"); если (stmt.Execute ()) { //Upadate список категорий Model.Categories = new System.Collections.ObjectModel.ObservableCollection<Категория>(); stmt = db.PrepareStatement ("ВЫБЕРИТЕ идентификатор, имя, описание ИЗ Категории"); в то время как (stmt.HasMore ()) { //Заполняем список категорий var id = stmt.ColumnAsIntAt (0); var catName = stmt.ColumnAsTextAt (1); var desc = stmt.ColumnAsTextAt (2); Model.Categories.Add (новая Категория () {Id = id, Name = catName, Описание = desc}); } } CategoryList.ItemsSource = Model.Categories; } } частные void GetBookByCategory (int categoryId) { SQLite.Database дБ = new SQLite.Database ("bookdb"); / / создает файл базы данных в локальную папку app если (db.Ready) { var stmt = db.PrepareStatement ("ВЫБЕРИТЕ Books.id, Books.name, автор, Books.description, categoryid, Categories.Name, Categories.Description ИЗ Книг INNER JOIN Категории, ГДЕ Books.categoryid = Categories.id И Books.categoryid = " + categoryId.ToString ()); Model.Books = new System.Collections.ObjectModel.ObservableCollection<Книга>(); в то время как (stmt.HasMore ()) { var книга = новая Книга (); book.Id = stmt.ColumnAsIntAt (0); book.Name = stmt.ColumnAsTextAt (1); book.Author = stmt.ColumnAsTextAt (2); book.Description = stmt.ColumnAsTextAt (3); книги.Категория = новая Категория (); book.Category.Id = stmt.ColumnAsIntAt (4); book.Category.Name = stmt.ColumnAsTextAt (5); book.Category.Description = stmt.ColumnAsTextAt (6); Model.Books.Add (книга); } BookList.ItemsSource = Model.Books; } } частные void CategoryList_SelectionChanged (object sender, SelectionChangedEventArgs e) { var index = CategoryList.SelectedIndex; ChosenCategoryTextBlock.Text = "Категория: " + Модели.Категории [индекс] .Name; //Показать книги выбранной категории GetBookByCategory (Model.Categories [индекс] .Id); } частные async void InitDbButton_Click (object sender, RoutedEventArgs e) { InitDb (); } частные async void InitDb () { bool searchResult = false; StorageFolder storageFolder = ApplicationData.Current.LocalFolder; попробуйте { StorageFile sampleFile = ждут storageFolder.GetFileAsync ("bookdb"); searchResult = true; } вылов (FileNotFoundException) { } if (!searchResult) { var resourceLoader = new ResourceLoader (); var file = resourceLoader.GetFile ("bookdb"); var эксплуатация = ждут file.CopyAsync (ApplicationData.Current.LocalFolder, "bookdb"); } InitViewModel (); DataContext = Модель; } частные async void ReplaceDbButton_Click (object sender, RoutedEventArgs e) { bool searchResult = false; StorageFolder storageFolder = ApplicationData.Current.LocalFolder; попробуйте { StorageFile sampleFile = ждут storageFolder.GetFileAsync ("bookdb"); ждут sampleFile.DeleteAsync (); var resourceLoader = new ResourceLoader (); var file = resourceLoader.GetFile ("bookdb"); file.CopyAsync (ApplicationData.Current.LocalFolder, "bookdb"); searchResult = true; } вылов (FileNotFoundException) { } if (!searchResult) { var resourceLoader = new ResourceLoader (); var file = resourceLoader.GetFile ("bookdb"); var эксплуатация = ждут file.CopyAsync (ApplicationData.Current.LocalFolder, "bookdb"); } } } } MetroDbAccess { partial class MainPage { public MainPageViewModel Model { get; set; } public MainPage() { InitializeComponent(); Model = new MainPageViewModel(); InitDb(); } private void SaveButton_Click(object sender, RoutedEventArgs e) { if (CategoryList.SelectedIndex < 0) { ChosenCategoryTextBlock.Text = "No category is selected!"; ChosenCategoryTextBlock.Foreground = new SolidColorBrush(Colors.Red); return; } SQLite.Database db = new SQLite.Database("bookdb"); // creates the database file in the local app folder if (db.Ready) { var stmt = db.PrepareStatement("CREATE TABLE IF NOT EXISTS Books (id INTEGER PRIMARY KEY, name TEXT, author TEXT, description TEXT, categoryid INTEGER)"); if (stmt.Execute()) { stmt = db.PrepareStatement("INSERT INTO Books (id, name, author, description, categoryid) VALUES (NULL, ?, ?, ?, ?)"); stmt.BindText(1, NameTextBox.Text); stmt.BindText(2, AuthorTextBox.Text); stmt.BindText(3, DescriptionTextBox.Text); var catId = Model.Categories[CategoryList.SelectedIndex].Id; stmt.BindInt(4, catId); if (stmt.Execute()) { GetBookByCategory(catId); } } } } private void SaveCategoryButton_Click(object sender, RoutedEventArgs e) { string name = CategoryNameTextBox.Text; string description = CategoryDescriptionTextBox.Text; if (string.IsNullOrEmpty(name)) return; SQLite.Database db = new SQLite.Database("bookdb"); // creates the database file in the local app folder if (db.Ready) { var stmt = db.PrepareStatement("CREATE TABLE IF NOT EXISTS Categories (id INTEGER PRIMARY KEY,name TEXT, description TEXT)"); if (stmt.Execute()) { stmt = db.PrepareStatement("INSERT INTO Categories (id, name, description) VALUES (NULL, ?, ?)"); stmt.BindText(1, name); stmt.BindText(2, description); if (stmt.Execute()) { InitViewModel(); } } } } private void InitViewModel() { SQLite.Database db = new SQLite.Database("bookdb"); // creates the database file in the local app folder if (db.Ready) { var stmt = db.PrepareStatement("CREATE TABLE IF NOT EXISTS Categories (id INTEGER PRIMARY KEY,name TEXT, description TEXT)"); if (stmt.Execute()) { //Upadate the category list Model.Categories = new System.Collections.ObjectModel.ObservableCollection<Category>(); stmt = db.PrepareStatement("SELECT id, name, description FROM Categories"); while (stmt.HasMore()) { //Fill the category list var id = stmt.ColumnAsIntAt(0); var catName = stmt.ColumnAsTextAt(1); var desc = stmt.ColumnAsTextAt(2); Model.Categories.Add(new Category() { Id = id, Name = catName, Description = desc }); } } CategoryList.ItemsSource = Model.Categories; } } private void GetBookByCategory(int categoryId) { SQLite.Database db = new SQLite.Database("bookdb"); // creates the database file in the local app folder if (db.Ready) { var stmt = db.PrepareStatement("SELECT Books.id, Books.name, author, Books.description, categoryid, Categories.Name, Categories.Description FROM Books INNER JOIN Categories WHERE Books.categoryid = Categories.id AND Books.categoryid = " + categoryId.ToString()); Model.Books = new System.Collections.ObjectModel.ObservableCollection<Book>(); while (stmt.HasMore()) { var book = new Book(); book.Id = stmt.ColumnAsIntAt(0); book.Name = stmt.ColumnAsTextAt(1); book.Author = stmt.ColumnAsTextAt(2); book.Description = stmt.ColumnAsTextAt(3); book.Category = new Category(); book.Category.Id = stmt.ColumnAsIntAt(4); book.Category.Name = stmt.ColumnAsTextAt(5); book.Category.Description = stmt.ColumnAsTextAt(6); Model.Books.Add(book); } BookList.ItemsSource = Model.Books; } } private void CategoryList_SelectionChanged(object sender, SelectionChangedEventArgs e) { var index = CategoryList.SelectedIndex; ChosenCategoryTextBlock.Text = "Category: " + Model.Categories[index].Name; //Show ebooks of the selected category GetBookByCategory(Model.Categories[index].Id); } private async void InitDbButton_Click(object sender, RoutedEventArgs e) { InitDb(); } private async void InitDb() { bool searchResult = false; StorageFolder storageFolder = ApplicationData.Current.LocalFolder; try { StorageFile sampleFile = await storageFolder.GetFileAsync("bookdb"); searchResult = true; } catch (FileNotFoundException) { } if (!searchResult) { var resourceLoader = new ResourceLoader(); var file = resourceLoader.GetFile("bookdb"); var operation = await file.CopyAsync(ApplicationData.Current.LocalFolder, "bookdb"); } InitViewModel(); DataContext = Model; } private async void ReplaceDbButton_Click(object sender, RoutedEventArgs e) { bool searchResult = false; StorageFolder storageFolder = ApplicationData.Current.LocalFolder; try { StorageFile sampleFile = await storageFolder.GetFileAsync("bookdb"); await sampleFile.DeleteAsync(); var resourceLoader = new ResourceLoader(); var file = resourceLoader.GetFile("bookdb"); file.CopyAsync(ApplicationData.Current.LocalFolder, "bookdb"); searchResult = true; } catch (FileNotFoundException) { } if (!searchResult) { var resourceLoader = new ResourceLoader(); var file = resourceLoader.GetFile("bookdb"); var operation = await file.CopyAsync(ApplicationData.Current.LocalFolder, "bookdb"); } } } }

9-Й ШАГ: Поздравляю! Мы создали Metro приложение, которое может получить доступ к БД sqlite. В случае, если у вас есть какие-то проблемы, вы можете скачать мой пример кода для ссылки.

 

Оставить комментарий

Читайте ранее:
Как восстановить отсутствующий hal.dll.

Что такое Hal.dll? Hal.dll является основным процессом файлов HAL, которые обычно генерируют сообщения об ошибке при запуске Windows.HAL выступает за Hardware...

Закрыть