在絕大多數應用中,免不了要做的一項就是設置這樣的本地數據存儲。簡單的數據存儲我們可以使用 LocalSettings 或者 IsolatedStorageFile(獨立存儲)等等的方式來進行本地數據存儲。但是,如果數據比較復雜,或者是存在關聯關系的情況下,這種簡單的鍵值存儲方式是不夠用的。這時候就需要用到數據庫來進行存儲。說到數據庫,小型、輕量基於文件的 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 的嗎?為什么阿歷山大大帝還在?!(阿力山大大帝:我怎么躺槍了)
查閱園子里的資料得知:
所以要判斷的話,只能在插入數據前判斷了。
五、查看存儲的數據庫
首先先打開項目的 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 語句。