【Win10】在應用中使用 SQLite 數據庫


在絕大多數應用中,免不了要做的一項就是設置這樣的本地數據存儲。簡單的數據存儲我們可以使用 LocalSettings 或者 IsolatedStorageFile(獨立存儲)等等的方式來進行本地數據存儲。但是,如果數據比較復雜,或者是存在關聯關系的情況下,這種簡單的鍵值存儲方式是不夠用的。這時候就需要用到數據庫來進行存儲。說到數據庫,小型、輕量基於文件的 SQLite 就很適合在這種場合使用。

一、安裝 SQLite for Universal App Platform VSIX 擴展

打開菜單欄的工具-擴展與更新,選擇左側的聯機選項卡,在右上角搜索框輸入 SQLite。

QQ截圖20150910231148

安裝上面這個 SQLite for Universal App Platform 擴展。等待安裝完成后,重新啟動 Visual Studio。

二、在項目中添加引用

1、添加對 SQLite 的引用

新建一個項目(當然在現有項目添加也可以,這里只是演示)。等待新建完成后,添加引用。

QQ截圖20150910231651

QQ截圖20150910231758

按照圖片中的步驟,找到 SQLite for Universal App Platform,並勾選,然后按右下角的確定按鈕。

2、添加 SQLite.Net 的引用

QQ截圖20150910231927

QQ截圖20150910234739

或者可以直接在程序包管理器控制台鍵入:Install-Package SQLite.Net-PCL 來進行安裝。

3、確保引用無誤

確保項目是把這兩個包都引用上

QQ截圖20150910234837

三、開始編碼

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。

程序運行起來后,我們先添加幾個數據:

QQ截圖20150911005840

QQ截圖20150911005856

QQ截圖20150911005919

QQ截圖20150911005941

添加完這 4 個數據之后,我們點擊查詢按鈕。

QQ截圖20150911005950

好像沒什么問題。慢着,我們的 Person 模型不是在 Name 屬性上標注了 MaxLength 為 5 的嗎?為什么阿歷山大大帝還在?!(阿力山大大帝:我怎么躺槍了)

查閱園子里的資料得知:

QQ截圖20150911010530

新知識點 GET!bba_thumb(這問題之前一直沒怎么留意過……)

所以要判斷的話,只能在插入數據前判斷了。

五、查看存儲的數據庫

首先先打開項目的 Package.appxmanifest 文件,然后選擇打包選項卡。

QQ截圖20150911011422

將包名這串字符串復制下來。

打開文件瀏覽器,路徑輸入 %USERPROFILE%\AppData\Local\Packages\

然后在右上角搜索剛剛復制的包名。

QQ截圖20150911011535

打開這個文件夾。

QQ截圖20150911011649

然后打開 LocalState 這個文件夾,里面可以發現一個 test.db 的文件,這就是我們的數據庫了。

然后我們把它復制出來,並用 SQLite 數據庫軟件打開它,這里我使用的是 SQLiteStudio,百毒一下就有它的官方網站了。

QQ截圖20150911011953

QQ截圖20150911012021

QQ截圖20150911012104

QQ截圖20150911012157

QQ截圖20150911012321

按上面的步驟的話,就能夠看到我們定義的 Person 類所對應的表結構了。

QQ截圖20150911204523

而且也能看見我們剛剛插入的數據。

六、結語

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 語句。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM