Xây d?ng ?ng d?ng Metro tương tác v?i d? li?u SQLite

ID c?a bài: 2663593
Bung t?t c? | Thu g?n t?t c?

V? tác gi?

Thu g?n b?ng nàyBung r?ng b?ng này
Thu g?n h?nh ?nh nàyBung r?ng h?nh ?nh này
2401266
Bài vi?t này đư?c cung c?p b?i MVP Lê Hoàng D?ng. Microsoft chân thành c?m ơn nh?ng MVP đ? chia x? nh?ng kinh nghi?m chuyên môn c?a m?nh v?i nh?ng ngư?i s? d?ng khác. Bài vi?t này s? đư?c đăng trên website ho?c blog c?a MVP sau đây. N?u b?n mu?n xem các bài vi?t khác đư?c chia x? b?i MVP, vui l?ng nháy chu?t vào đây.

?ng d?ng Metro

?ng d?ng Metro là m?t khái ni?m m?i v? thi?t k? và phát tri?n các ?ng d?ng có giao di?n tràn đ?y màn h?nh (full screen). Ngư?i l?p tr?nh nh? đó mà có th? ki?m soát và s? d?ng m?i đi?m ?nh trên màn h?nh, và giúp cho ngư?i dùng có th? tr?i nghi?m ?ng d?ng c?a h? tr?n màn h?nh. Ngư?i l?p tr?nh có th? s? d?ng các công ngh? hi?n t?i như HTML5, CSS, JavaScript ho?c C++, C# và VB.NET v?i XALM đ? phát tri?n các ?ng d?ng d?ng Metro. Ngư?i l?p tr?nh s? t?n d?ng ki?n th?c v? l?p tr?nh s?n có c?a m?nh và s? d?ng các t?p l?nh (APIs) có tên g?i là WinRT đ? s? d?ng các ch?c năng mà Windows 8 cung c?p đ? l?p tr?nh ?ng d?ng Metro.Đ? t?m hi?u v? các ?ng d?ng Metro và cách l?p tr?nh chúng, b?n có th? t?i b?n Windows 8 Developer Preview v? cài đ?t và vi?t các ?ng d?ng cho h? đi?u hành Windows 8 c?n r?t m?i m? này.

L?p tr?nh v?i CSDL trong ?ng d?ng Metro

? phiên b?n Developer Preview c?a Windows 8, Microsoft cho bi?t r?ng các ?ng d?ng Metro hoàn toàn không th? tương tác tr?c ti?p v?i các CSDL quan h? mà chúng ta thư?ng l?p tr?nh như SQLCE, Microsoft SQL Server..v.v mà thay vào đó n?u mu?n lưu tr? d? li?u ho?c tương tác v?i d? li?u th? chúng ta ch? có hai cách:
  • S? d?ng Local Storage (kho lưu tr? n?i b?) mà Window 8 cung c?p cho ?ng d?ng khi ?ng d?ng đư?c tri?n khai. V?i Local Storage, chúng ta có th? lưu các t?p tin ? đó, truy xu?t và x? l? chúng. Ví d?, chúng ta có th? lưu d? li?u trong các t?p tin XML và truy xu?t chúng. Cách lưu tr? này có ưu đi?m là giúp cô l?p các ?ng d?ng và khi?n các ?ng d?ng ch? có th? giao ti?p v?i nhau thông qua nh?ng cách mà Windows 8 quy đ?nh, CSDL mang tính ch?t bi?t l?p và nh? đó mà ngư?i l?p tr?nh không ph?i lo l?ng t?i các trư?ng h?p như m?t t?p tin b? truy xu?t đ?c ghi b?i nhi?u ?ng d?ng m?t l?n ..v.v, nhưng đó c?ng chính là như?c đi?m, b?i l?p tr?nh viên ph?i vi?t quá nhi?u code đ? x? l? d? li?u và r? ràng là nó không hoàn toàn đư?c t?i ưu b?ng vi?c s? d?ng CSDL quan h?.
  • S? d?ng CSDL quan h? b?ng cách vi?t các Services h? tr? truy xu?t CSDL, các ?ng d?ng Metro s? k?t n?i v?i các services lưu ho?c c?p nh?t d? li?u. Cách vi?t ?ng d?ng như v?y có th? g?i là l?p tr?nh ?ng d?ng phân tán. Đây là m?t cách l?p tr?nh hay, nhưng nó khó mà phù h?p v?i các ?ng d?ng nh?, và r? ràng là vi?c l?p tr?nh các ?ng d?ng như v?y s? chi?m r?t nhi?u th?i gian và công s?c c?a ngư?i l?p tr?nh.
L?p tr?nh v?i SQLite trong ?ng d?ng Metro

Gi?i l?p tr?nh hi?n nay v?n th?c m?c v?i vi?c t?i sao Microsoft không h? tr? SQLCE đ? giúp ngư?i l?p tr?nh d? dàng vi?t các ?ng d?ng Metro hư?ng CSDL và h? hy v?ng đi?u đó s? thay đ?i trong b?n Windows 8 Beta mà Microsoft s? phát hành trong tương lai g?n. Hi?n t?i, các l?p tr?nh viên ph?i l?p tr?nh v?i XML ho?c t?m m?t gi?i pháp kh? d? có th? thay th? cho vi?c l?p tr?nh v?i CSDL c?c b? SQLCE.M?t trong nh?ng gi?i pháp mà tôi t?m đư?c khi t?m hi?u v? vi?c l?p tr?nh ?ng d?ng Metro đó là s? d?ng SQLite b?ng cách s? d?ng d? án m? ngu?n m? sqlite-winrt trên CodePlex. Sqlite-winrt là m?t d? án nh?m m?c đích vi?t ra m?t thư vi?n .NET s? d?ng l?i code truy xu?t sqlite (đư?c vi?t b?ng C++). Tuy nhiên, đ? s? d?ng đư?c thư vi?n này vào d? án c?a b?n c?ng không ph?i là đi?u d? dàng.

S? d?ng sqlite-winrt đ? truy xu?t CSDL sqlite

Đ?u tiên b?n h?y cài lên máy ?o ho?c máy tính c?a m?nh h? đi?u hành Windows 8 có cài s?n Visual Studio Express 2011 đ? có th? l?p tr?nh và ch?y th? ?ng d?ng WinRT t?i đây. Các b?n c?ng có th? t?i b?n Windows 8 không cài đ?t s?n Visual Studio Express 2011 r?i t?i v? b?n Visual Studio 2011 riêng v? đ? cài, tuy nhiên các b?n s? g?p ph?i m?t s? vư?ng m?c khi mu?n xây d?ng ?ng d?ng Metro (tôi s? đ? c?p v? v?n đ? này ? m?t bài vi?t khác).

Sau đó b?n h?y t?i v? thư vi?n sqlite-winrt đ? có th? b?t đ?u l?p tr?nh ?ng d?ng Metro truy xu?t d? li?u sqlite.

Trư?c khi b?t đ?u chúng ta c?n lưu ? r?ng, ?ng d?ng chúng ta xây d?ng v?n tuân th? ch?t ch? các quy đ?nh v? xây d?ng các ?ng d?ng Metro, ngh?a là CSDL Sqlite s? đư?c lưu trong b? nh? Local Storage c?a ?ng d?ng, và đư?c truy xu?t b?i sqlite-winrt, đi?u đó c?ng có ngh?a là CSDL này ch? đư?c s? d?ng b?i ?ng d?ng chúng ta vi?t mà thôi.

?ng d?ng chúng ta xây d?ng s? là m?t ?ng d?ng đơn gi?n đ? lưu tr? thông tin v? nh?ng cu?n sách mà ngư?i s? d?ng yêu thích, các cu?n sách (Book) này s? đư?c lưu tr? theo danh m?c (Category), ngh?a là m?i danh m?c s? có nhi?u cu?n sách, và m?i cu?n sách s? ch? thu?c v? m?t danh m?c nào đó.

?ng d?ng c?a chúng ta có các ch?c năng chính:
  1. Hi?n th? danh sách các danh m?c đ? đư?c t?o
  2. Hi?n th? các cu?n sách c?a m?t danh m?c đư?c ch?n
  3. T?o danh m?c m?i
  4. T?o sách cho m?t danh m?c đư?c ch?n
Giao di?n c?a ?ng d?ng như sau:

Thu g?n h?nh ?nh nàyBung r?ng h?nh ?nh này
2664306



Tôi s? tr?nh bày cách vi?t d? án theo ki?u t?ng bư?c m?t đ? b?n đ?c có th? d? dàng theo d?i:


BƯ?C 1: T?o d? án theo có tên là MetroDbAccess và thêm tham chi?u đ?n thư vi?n sqlite-winrt b?ng cách tham chi?u đ?n t?p tin Sqlite.winmd mà b?n đ? t?i v?

Thu g?n h?nh ?nh nàyBung r?ng h?nh ?nh này
2664307


BƯ?C 2: T?o các Model

L?p Category

public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}

L?p Book

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

L?p MainPageViewModel (nh?m lưu tr? các thông tin dùng cho các control trên Mainpage.xaml.

public class MainPageViewModel
{
public MainPageViewModel()
{
Categories = new ObservableCollection<Category>();
Books = new ObservableCollection<Book>();
}
public ObservableCollection<Category> Categories { get; set; }
public ObservableCollection<Book> Books { get; set; }
}
BƯ?C 3: Thi?t k? giao di?n

Đ? có đư?c giao di?n như trên, tôi đ? đi?u ch?nh t?p tin MainPage.xaml đư?c t?o ra khi t?o d? án như sau:

<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>
Các b?n c?n lưu ? r?ng, trong này có s? d?ng k? thu?t Data Binding và có nh?ng khai báo qu?n l? s? ki?n (Event Handler), các k? thu?t này không khó đ?i v?i ngư?i có kinh nghi?m l?p tr?nh v?i Silverlight ho?c WPF, n?u b?n c?n xa l? v?i XAML, b?n có th? t?m hi?u các bài vi?t v? ch? đ? này.

BƯ?C 4: Cài đ?t m? c?a phương th?c InitViewModel() trong MainPage.xaml.cs. Phương th?c này s? m? CSDL sqlite có tên là bookdb trong Local Storage ho?c t?o m?i n?u chưa có. Sau đó nó s? t?o b?ng Categories n?u b?ng này chưa t?n t?i. Ti?p theo nó s? truy v?n đ? l?y danh sách các Category và bind vào CategoryList (ListView Control) – các b?n xem l?i m? XAML c?a CategoryList đ? xem cách tr?nh bày.

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;
}
}
BƯ?C 5: X? l? s? ki?n click chu?t lên m?t item trên CategoryList b?ng cách cài đ?t phương th?c CategoryList_SelectionChanged, phương th?c này s? g?i phương th?c GetBookByCategory đ? l?y danh sách các cu?n sách thu?c Category đư?c ch?n và sau đó bind vào control BookList

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);
}


BƯ?C 6: X? l? s? ki?n click c?a nút SaveCategoryButton đ? t?o Category m?i và c?p nh?t control CategoryList. Lưu ? r?ng, WinRT chưa h? tr? cho ObservableCollection nên Binding m?t chi?u và hai chi?u cho Control chưa th? th?c hi?n đư?c.

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();
}
}
}
}


BƯ?C 7: X? l? s? ki?n click chu?t c?a nút SaveButton đ? t?o sách m?i và c?p nh?t danh sách Book c?a Category đư?c ch?n.

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);
}
}
}
}


BƯ?C 8: Sao chép CSDL bookdb có s?n vào Local Storage trong l?n ch?y đ?u tiên

Đ?n ngang đây, chúng ta đ? có th? ch?y đư?c ?ng d?ng, t?o Category m?i, t?o Book m?i..v.v tuy nhiên có m?t v?n đ? l?n đó là, khi chúng ta deploy ?ng d?ng, th? CSDL c?a ?ng d?ng b?ng r?ng, b?i v? chúng ta không có s?n CSDL bookdb bên trong Local Storage c?a ?ng d?ng. Đ? gi?i quy?t đư?c v?n đ? này, chúng ta c?n ph?i có CSDL bookdb trư?c và lưu như là m?t tài nguyên c?a ?ng d?ng

Sau đó chúng ta s? xây d?ng phương th?c InitDb() đ? th?c hi?n vi?c sao chép CSDL bookdb vào LocalStorage b?ng cách s? d?ng t?p l?nh thao tác v?i LocalStorage do WinRT cung c?p

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

Phương th?c InitDb s? đư?c g?i ? c?u t? c?a l?p MainPage và s? ki?m tra xem th? bookdb đ? t?n t?i chưa, n?u chưa t?n t?i th? s? chép bookdb là csdl m?c đ?nh đư?c g?n làm tài nguyên có s?n trong project

M? ngu?n đ?y đ? c?a t?p tin MainPage.xaml.cs:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using MetroDbAccess.Model;
using Windows.ApplicationModel.Resources;
using Windows.Foundation;
using Windows.Storage;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Media;
namespace 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");
}
}
}
}


BƯ?C 9: Chúc m?ng b?n đ? xây d?ng ?ng d?ng thành công, h?y th? ch?y và ki?m tra ?ng d?ng. Trong trư?ng h?p không ch?y đư?c, b?n có th? thao kh?o code m?u t?i đây.

Trên đây là m?t bài hư?ng d?n v? cách l?p tr?nh CSDL v?i Sqlite cho ?ng d?ng Metro trên Windows 8, hy v?ng nó s? h?u ích v?i các b?n.

Tuyên b? Không ch?u trách nhi?m N?i dung Gi?i pháp C?ng đ?ng

CÔNG TY MICROSOFT VÀ/HO?C CÁC NHÀ CUNG C?P C?A H? KHÔNG B?O Đ?M V? TÍNH PHÙ H?P, Đ? TIN C?Y HO?C TÍNH CHÍNH XÁC C?A THÔNG TIN VÀ H?NH ?NH LIÊN QUAN ? ĐÂY. M?I THÔNG TIN VÀ H?NH ?NH NHƯ V?Y ĐƯ?C CUNG C?P “NHƯ NGUYÊN M?U” MÀ KHÔNG CÓ B?T K? B?O Đ?M NÀO. MICROSOFT VÀ/HO?C CÁC NHÀ CUNG C?P C?A H? KHÔNG CH?U TRÁCH NHI?M Đ?I V?I M?I B?O Đ?M VÀ ĐI?U KI?N V? THÔNG TIN VÀ H?NH ?NH LIÊN QUAN NÀY, BAO G?M C? M?I B?O Đ?M VÀ ĐI?U KI?N LIÊN QUAN V? TÍNH THƯƠNG M?I, PHÙ H?P CHO M?T M?C ĐÍCH Đ?C BI?T, N? L?C C?A CÔNG VI?C, TƯ CÁCH VÀ CAM K?T KHÔNG VI PH?M. B?N Đ?NG ? M?T CÁCH C? TH? LÀ KHÔNG CÓ TRƯ?NG H?P NÀO MÀ MICROSOFT VÀ/HO?C CÁC NHÀ CUNG C?P C?A H? B? RÀNG BU?C VÀO B?T K? THI?T H?I TR?C TI?P, GIÁN TI?P, TR?NG PH?T, T?NH C?, Đ?C BI?T, H? QU? HO?C B?T K? THI?T H?I D?NG NÀO, BAO G?M NHƯNG KHÔNG GI?I H?N THI?T H?I DO M?T MÁT, D? LI?U HO?C L?I ÍCH, X?Y RA HO?C TRONG M?I CÁCH LIÊN QUAN Đ?N VI?C S? D?NG HO?C KHÔNG TH? S? D?NG THÔNG TIN VÀ H?NH ?NH LIÊN QUAN CÓ ? ĐÂY, DÙ LÀ D?A VÀO H?P Đ?NG, L?I GÂY THI?T H?I, SƠ SU?T, NGH?A V? PHÁP L? HO?C B?T K? CƠ S? NÀO KHÁC, NGAY C? N?U MICROSOFT HO?C B?T K? NHÀ CUNG C?P NÀO C?A H? Đ? ĐƯ?C TƯ V?N V? KH? NĂNG B? THI?T H?I.
Note This is a "FAST PUBLISH" article created directly from within the Microsoft support organization. The information contained herein is provided as-is in response to emerging issues. As a result of the speed in making it available, the materials may include typographical errors and may be revised at any time without notice. See Terms of Use for other considerations.

Thu?c tính

ID c?a bài: 2663593 - L?n xem xét sau cùng: 30 Tháng Giêng 2012 - Xem xét l?i: 2.0
T? khóa: 
kbprb kbtshoot kbstepbystep kbgraphxlink kbmvp KB2663593

Cung cấp Phản hồi

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com