在 UWP 應用程式中使用 SQLite 資料庫
您可以使用 SQLite,在使用者裝置上的輕量資料庫中儲存和擷取數據。 本指南說明如何。
使用 SQLite 進行本地儲存的一些優點
✔️ SQLite 是輕量型和獨立式。 它是不含任何其他相依性的程式庫。 不需要進行任何設定。
✔️ 沒有資料庫伺服器。 用戶端和伺服器會在相同的進程中執行。
✔️ SQLite 屬於公共領域,因此您可以自由使用並分發您的應用程式。
✔️ SQLite 可跨平臺和架構運作。
您可以在這裡深入瞭解 SQLite ,。
選擇抽象層
建議您使用 Entity Framework Core 或開放原始碼 SQLite 連結庫, Microsoft所建置。
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 套件。
注意
請確定你安裝 Microsoft.Data.Sqlite' package and not 'Microsoft.Data.Sqlite.Core
。 此套件將安裝 Microsoft.Data.Sqlite.Core
作為相依項。
所有支援的 Windows 版本都支援 SQLite,因此您的應用程式不需要封裝 SQLite 連結庫。 相反地,您的應用程式可以使用隨 Windows 一起安裝的 SQLite 版本。 這可透過幾種方式協助您。
✔️ 減少應用程式的大小,因為您不需要下載 SQLite 二進位檔,然後將它封裝為應用程式的一部分。
✔️ 防止您需要在 SQLite 公布針對 Bug 和安全性漏洞的重大修正時,推送新版本的應用程式給使用者。 SQLite 的 Windows 版本是由Microsoft與 SQLite.org 協調維護。
✔️ 應用程式載入時間可能會更快,因為最有可能是 SDK 版本的 SQLite 已載入記憶體中。
讓我們從新增一個名為 DataAccess的類別到你的 UWP 項目開始。 您可以使用 .NET Standard 類別庫專案來包含您的數據存取程序代碼,但我們不會在我們的範例中使用。
以滑鼠右鍵點擊方案,然後點擊 [為方案管理 NuGet 套件。
此時,您有選擇。 您可以使用隨附於 Windows 的 SQLite 版本,或如果您有使用特定 SQLite 版本的原因,您可以在套件中包含 SQLite 連結庫。 我們將使用 Windows 隨附的 SQLite 版本。
選擇 [流覽] 索引標籤,搜尋 Microsoft.Data.SQLite.Core 套件,然後安裝最新的穩定版本。
在 SQLite 資料庫中新增和擷取數據
我們會執行下列動作:
1️⃣ 準備數據存取類別。
2️⃣ 初始化 SQLite 資料庫。
3️⃣ 將數據插入 SQLite 資料庫中。
4️⃣ 從 SQLite 資料庫擷取數據。
5️⃣ 新增基本用戶介面。
準備數據存取類別
在您的項目中開啟 DataAccess
類別,並將該類別設為靜態。
注意
雖然我們的範例會將數據存取程式代碼放在靜態類別中,但它只是設計選擇,而且是完全選擇性的。
public static class DataAccess
{
}
將下列 using 語句新增至此檔案頂端。
using Microsoft.Data.Sqlite;
using System.Collections.Generic;
初始化 SQLite 資料庫
將方法新增至初始化 SQLite 資料庫的 DataAccess
類別。
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}"))
{
SQLitePCL.Batteries.Init();
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 方法會將指定資料行的值當做字串傳回。 它接受整數值,表示所要數據之以零起始的數據行序數。 您可以使用類似的方法,例如 GetDataTime 和 GetBoolean。 根據數據行所包含的數據類型選擇方法。
在這個範例中,序數參數並不重要,因為我們正在選取單一列中的所有項目。 不過,如果多個數據行是查詢的一部分,請使用序數值來取得您想要從中提取數據的數據行。
新增基本使用者介面
在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中與Button
的Click
事件相關聯的方法。
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 應用程式中使用 SQL Server 資料庫。
跨不同平臺在不同應用程式之間共享程序代碼
請參閱 在桌面與UWP之間共用程式代碼。
使用 Azure SQL 後端新增主要詳細數據頁面
請參閱 客戶訂單資料庫範例。