在 UWP 應用程式中使用 SQLite 資料庫

您可以使用 SQLite 在使用者的裝置上儲存和擷取輕量資料庫中的資料。 本指南會示範怎麼做。

使用 SQLite 進行本機儲存的一些優點

✔️ SQLite 輕量且獨立。 它是不需要任何其他相依性的程式庫。 不需進行任何設定。

✔️ 沒有資料庫伺服器。 用戶端和伺服器以相同程序執行。

✔️ SQLite 位於公用網域,您可以自由使用並隨您的應用程式散發。

✔️ SQLite 可跨平台和架構運作。

您也可以在這裡閱讀更多有關 SQLite 的資訊。

選擇抽象層

我們建議您使用 Entity Framework Core 或 Microsoft 所建置的開放原始碼 SQLite 程式庫

Entity Framework Core

Entity Framework (EF) 為物件關聯式對應程式,可讓您使用網域特定物件處理關聯式資料。 如果您已使用此架構處理其他 .NET 應用程式中的資料,可將該程式碼移轉到 UWP 應用程式,適當變更連接字串之後就能運作。

若要試用,請參閱開始使用 EF Core

SQLite 程式庫

Microsoft.Data.Sqlite 程式庫會在 System.Data.Common 命名空間中實作介面。 Microsoft 會主動維護這些實作,並提供直覺的包裝函式來處理低階原生 SQLite API。

本指南的其餘部分可協助您使用此程式庫。

設定您的解決方案以使用 Microsoft.Data.SQlite 程式庫

我們會從基本 UWP 專案開始,然後安裝適當的 Nuget 套件。

所有支援的 Windows 版本都支援 SQLite,因此您的應用程式不需要封裝 SQLite 程式庫。 您的應用程式可以改用隨 Windows 安裝的 SQLite 版本。 這可為您提供幾個方面的協助。

✔️ 縮減應用程式的大小,因為您不需要下載 SQLite 二進位檔,然後將它封裝為應用程式的一部分。

✔️ 您不需要推送應用程式的新版本給使用者,在 SQLite 發佈 SQLite 中錯誤和安全性弱點的重大修正時。 Windows 版 SQLite 是由 Microsoft 與 SQLite.org 共同維護。

✔️ 應用程式載入時間可能更快,因為 SDK 版的 SQLite 很可能已載入記憶體中。

讓我們從將類別新增至名為 DataAccess的 UWP 專案開始。 您可以使用 .NET 標準類別庫專案來包含您的資料存取程式碼,但我們不會在我們的範例中使用。

以滑鼠右鍵按一下解決方案,然後按一下 [管理解決方案的 NuGet 套件]

Another screenshot of the Solution Explorer panel with the project right-clicked and the Manage NuGet Packages option highlighted.

此時,您會有一個選擇。 您可以使用隨 Windows 提供的 SQLite 版本,或如果您因故需要使用特定 SQLite 版本,可以在您的套件中包含 SQLite 程式庫。 我們將使用 Windows 隨附的 SQLite 版本。

選擇 [瀏覽] 索引標籤,搜尋 Microsoft.Data.SQLite.Core 套件,然後安裝最新的穩定版本。

SQLite Core package

在 SQLite 資料庫中新增和擷取資料

我們將執行下列工作︰

1️⃣準備資料存取類別。

2️⃣ 初始化 SQLite 資料庫。

3️⃣ 將資料插入 SQLite 資料庫。

4️⃣ 從 SQLite 資料庫擷取資料。

5️⃣ 新增基本使用者介面。

準備資料存取類別

在您的專案中開啟 DataAccess 類別,並將該類別設為靜態。

注意

在範例中,我們會將資料存取碼放入靜態類別中,這只是一種設計上的選擇,完全非硬性規定。

public static class DataAccess
{

}

將下列 using 陳述式新增到此檔案的頂端。

using Microsoft.Data.Sqlite;
using System.Collections.Generic;

初始化 SQLite 資料庫

新增方法至 DataAccess 類別,以初始化 SQLite 資料庫。

public async static void InitializeDatabase()
{ 
     await ApplicationData.Current.LocalFolder.CreateFileAsync("sqliteSample.db", CreationCollisionOption.OpenIfExists);
     string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
     using (SqliteConnection db =
        new SqliteConnection($"Filename={dbpath}"))
    {
        db.Open();

        String tableCommand = "CREATE TABLE IF NOT " +
            "EXISTS MyTable (Primary_Key INTEGER PRIMARY KEY, " +
            "Text_Entry NVARCHAR(2048) NULL)";

        SqliteCommand createTable = new SqliteCommand(tableCommand, db);

        createTable.ExecuteReader();
    }
}

此程式碼會建立 SQLite 資料庫,並將它儲存在應用程式的本機資料存放區。

在此範例中,我們將資料庫命名為 sqlliteSample.db,但您可以使用任意名稱,只要您將該名稱用於您具現化的所有 SqliteConnection 物件。

在 UWP 專案的 App.xaml.cs 檔案建構函式中,呼叫 DataAccess 類別的 InitializeDatabase 方法。

public App()
{
    this.InitializeComponent();
    this.Suspending += OnSuspending;

    DataAccess.InitializeDatabase();
}

將資料插入 SQLite 資料庫

新增方法至 DataAccess 類別,將資料插入 SQLite 資料庫。 此程式碼會在查詢中使用參數,以避免 SQL 插入攻擊。

public static void AddData(string inputText)
{
    string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
    using (SqliteConnection db =
      new SqliteConnection($"Filename={dbpath}"))
    {
        db.Open();

        SqliteCommand insertCommand = new SqliteCommand();
        insertCommand.Connection = db;

        // Use parameterized query to prevent SQL injection attacks
        insertCommand.CommandText = "INSERT INTO MyTable VALUES (NULL, @Entry);";
        insertCommand.Parameters.AddWithValue("@Entry", inputText);

        insertCommand.ExecuteReader();
    }

}

從 SQLite 資料庫擷取資料

新增從 SQLite 資料庫取得資料列的方法。

public static List<String> GetData()
{
    List<String> entries = new List<string>();

   string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
   using (SqliteConnection db =
      new SqliteConnection($"Filename={dbpath}"))
    {
        db.Open();

        SqliteCommand selectCommand = new SqliteCommand
            ("SELECT Text_Entry from MyTable", db);

        SqliteDataReader query = selectCommand.ExecuteReader();

        while (query.Read())
        {
            entries.Add(query.GetString(0));
        }
    }

    return entries;
}

Read 方法會逐一處理所傳回的資料列。 如果有剩餘的列,它會傳回 true,否則會傳回 false

GetString 方法會將所指定欄的值做為字串傳回。 它接受整數值,代表您要的資料的以零起始欄序數。 您可以使用類似的方法,例如 GetDataTimeGetBoolean。 根據欄所包含的資料類型選擇方法。

在此範例中,序數參數並不那麼重要,因為我們會選取一欄中的所有項目。 不過,如果您的查詢中有多欄,請使用序數值取得要從中擷取資料的欄。

新增基本使用者介面

在 UWP 專案的 MainPage.xaml 檔案中,新增下列 XAML。

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel>
        <TextBox Name="Input_Box"></TextBox>
        <Button Click="AddData">Add</Button>
        <ListView Name="Output">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackPanel>
</Grid>

這個基本使用者介面會提供 TextBox 給使用者,讓他們用來輸入字串,我們會將該字串新增到 SQLite 資料庫。 我們會將此 UI 中的 Button 連接至事件處理常式,它會從 SQLite 資料庫擷取資料,然後在 ListView 中顯示該資料。

MainPage.xaml.cs 檔案中,新增下列處理常式。 這是我們與 UI 中 ButtonClick 事件產生關聯的方法。

private void AddData(object sender, RoutedEventArgs e)
{
    DataAccess.AddData(Input_Box.Text);

    Output.ItemsSource = DataAccess.GetData();
}

我們也想要確定應用程式啟動時會載入任何現有的資料。 將程式程式碼新增至 MainPage 建構函式,以呼叫 GetData()

public MainPage()
{
    this.InitializeComponent();

    Output.ItemsSource = DataAccess.GetData();
}

這樣就大功告成了。 探索 Microsoft.Data.Sqlite,了解還可以利用 SQLite 資料庫做什麼。 查看下列連結,了解在您的 UWP 應用程式中使用資料的其他方式。

下一步

將您的應用程式直接連接至 SQL Server 資料庫

請參閱在 UWP app 中使用 SQL Server 資料庫

在不同平台的不同應用程式之間共用程式碼

請參閱在桌面應用程式與 UWP 之間共用程式碼

在 Azure SQL 後端新增主要詳細資料頁面

請參閱客戶訂單資料庫範例 (英文)。