標籤:
在絕大多數應用中,免不了要做的一項就是設定這樣的本機資料儲存。簡單的資料存放區我們可以使用 LocalSettings 或者 IsolatedStorageFile(隔離儲存區 (Isolated Storage))等等的方式來進行本機資料儲存。但是,如果資料比較複雜,或者是存在關聯關係的情況下,這種簡單的KVStore for Redis方式是不夠用的。這時候就需要用到資料庫來進行儲存。說到資料庫,小型、輕量基於檔案的 SQLite 就很適合在這種場合使用。
一、安裝 SQLite for Universal App Platform VSIX 擴充
開啟功能表列的工具-擴充與更新,選擇左側的聯機選項卡,在右上方搜尋方塊輸入 SQLite。
安裝上面這個 SQLite for Universal App Platform 擴充。等待安裝完成後,重新啟動 Visual Studio。
二、在項目中添加引用1、添加對 SQLite 的引用
建立一個項目(當然在現有項目添加也可以,這裡只是示範)。等待建立完成後,添加引用。
按照圖片中的步驟,找到 SQLite for Universal App Platform,並勾選,然後按右下角的確定按鈕。
2、添加 SQLite.Net 的引用
或者可以直接在封裝管理員控制台鍵入:Install-Package SQLite.Net-PCL 來進行安裝。
3、確保引用無誤
確保項目是把這兩個包都引用上
三、開始編碼1、編寫用於測試的 Person 模型類
public class Person{ [PrimaryKey]// 主鍵。 [AutoIncrement]// 自動成長。 public int Id { get; set; } [MaxLength(5)]// 對應到資料庫 varchar 的大小。 public string Name { get; set; }}
需要注意的是,MaxLengthAttribute 所在的命名空間是 SQLite.Net.Attributes,而不是 .Net 架構裡的 System.ComponentModel.DataAnnotations。
2、編寫測試頁面的前台 Xaml 代碼
<Page x:Class="SqliteDemo.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <StackPanel Margin="100"> <TextBlock Text="添加"></TextBlock> <TextBox Header="名字" x:Name="txtAddName"></TextBox> <Button Content="添加進資料庫" Click="BtnAdd_Click"></Button> <TextBlock Text="查詢" Margin="0,50,0,0"></TextBlock> <Button Content="查詢所有" Click="BtnGetAll_Click"></Button> </StackPanel> </Grid></Page>
3、編寫測試頁面的後台 cs 代碼
public sealed partial class MainPage : Page{ public MainPage() { this.InitializeComponent(); } private async void BtnAdd_Click(object sender, RoutedEventArgs e) { string name = txtAddName.Text; using (var conn = AppDatabase.GetDbConnection()) { // 需要添加的 Person 對象。 var addPerson = new Person() { Name = name }; // 受影響行數。 var count = conn.Insert(addPerson); string msg = $"新增的 Person 對象的 Id 為 {addPerson.Id},Name 為 {addPerson.Name}"; await new MessageDialog(msg).ShowAsync(); } } private async void BtnGetAll_Click(object sender, RoutedEventArgs e) { using (var conn = AppDatabase.GetDbConnection()) { StringBuilder msg = new StringBuilder(); var dbPerson = conn.Table<Person>(); msg.AppendLine($"資料庫中總共 {dbPerson.Count()} 個 Person 對象。"); foreach (var person in dbPerson) { msg.AppendLine($"Id:{person.Id};Name:{person.Name}"); } await new MessageDialog(msg.ToString()).ShowAsync(); } }}
4、編寫 AppDatabase 類
public static class AppDatabase{ /// <summary> /// 資料庫檔案所在路徑,這裡使用 LocalFolder,資料庫檔案名叫 test.db。 /// </summary> public readonly static string DbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "test.db"); public static SQLiteConnection GetDbConnection() { // 串連資料庫,如果資料庫檔案不存在則建立一個空資料庫。 var conn = new SQLiteConnection(new SQLitePlatformWinRT(), DbPath); // 建立 Person 模型對應的表,如果已存在,則忽略該操作。 conn.CreateTable<Person>(); return conn; }}
四、運行
注意:必須將項目的編譯改為 x86 或者 x64,不能是 Any。
程式運行起來後,我們先添加幾個資料:
添加完這 4 個資料之後,我們點擊查詢按鈕。
好像沒什麼問題。慢著,我們的 Person 模型不是在 Name 屬性上標註了 MaxLength 為 5 的嗎?為什麼阿曆山大大帝還在?!(阿力山大大帝:我怎麼躺槍了)
查閱園子裡的資料得知:
新知識點 GET!(這問題之前一直沒怎麼留意過……)
所以要判斷的話,只能在插入資料前判斷了。
五、查看儲存的資料庫
首先先開啟項目的 Package.appxmanifest 檔案,然後選擇打包選項卡。
將包名這串字串複製下來。
開啟檔案瀏覽器,路徑輸入 %USERPROFILE%\AppData\Local\Packages\
然後在右上方搜尋剛剛複製的包名。
開啟這個檔案夾。
然後開啟 LocalState 這個檔案夾,裡面可以發現一個 test.db 的檔案,這就是我們的資料庫了。
然後我們把它複製出來,並用 SQLite 資料庫軟體開啟它,這裡我使用的是 SQLiteStudio,百毒一下就有它的官方網站了。
按上面的步驟的話,就能夠看到我們定義的 Person 類所對應的表結構了。
而且也能看見我們剛剛插入的資料。
六、結語1、為啥寫這篇 blog ?
今天看見 MS-UAP 寫了篇也是關於使用 SQLite 的 blog,才想起之前就一直也想寫一篇關於 WinRT 下如何使用 SQLite 的 blog。純粹填坑,部分內容與 MS-UAP 寫的重複,本文可作為補充。
2、本文適用人群
①、對 SQLite 有使用需求的人群,不一定是 UWP 的開發人員,因為這個 SQLite.Net 的庫是 PCL 的,可以在其它平台(例如 Winform)也能使用,在 SQLiteConnection 的建構函式傳遞相應平台的參數即可。
②、ORM 愛好者、討厭 sql 人群。像我這種 sql 不怎麼樣的就只能抱 ORM 的大腿了。所以如果是 sql 愛好者,請去看 MS-UAP 寫的那篇,那篇使用的 SQLite 庫是類似 C 的風格,使用傳統的 sql 語句。
【Win10】在應用中使用 SQLite 資料庫