在 UWP 应用中使用 SQLite 数据库
可以使用 SQLite 在用户的设备上轻量级数据库中存储和检索数据。 本指南介绍如何操作。
将 SQLite 用于本地存储的一些优势
✔️ SQLite 具有轻量和独立的特点。 它是一个代码库,没有任何其他依赖项。 无需进行任何配置。
✔️ 没有数据库服务器。 客户端和服务器在同一进程中运行。
✔️ SQLite 位于公共域中,因此你可以随意使用和分发应用。
✔️ SQLite 跨平台和体系结构工作。
可以在此处阅读更多关于 SQLite 的内容。
选择抽象层
我们建议您使用 Entity Framework Core 或由微软开发的开源 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 包。
注意
请务必安装 Microsoft.Data.Sqlite' package and not 'Microsoft.Data.Sqlite.Core
。 此包将安装 Microsoft.Data.Sqlite.Core
作为依赖项。
所有受支持的 Windows 版本都支持 SQLite,因此你的应用无需打包 SQLite 库。 相反,你的应用可以使用随 Windows 一起安装的 SQLite 版本。 这可以通过一些方式帮助你。
✔️ 减小应用程序的大小,因为无需下载 SQLite 二进制文件,然后将其打包为应用程序的一部分。
✔️ 如果 SQLite 发布了针对 SQLite 中的 bug 和安全漏洞的重要修复程序,你就不必向用户推送你的应用的新版本。 SQLite 的 Windows 版本由Microsoft与 SQLite.org 协调维护。
✔️ 应用加载时间可能更快,因为很可能 SDK 版本的 SQLite 已加载到内存中。
首先,向 UWP 项目添加一个名为 DataAccess的类。 可以使用 .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 数据库。
跨不同平台在不同应用之间共享代码
使用 Azure SQL 后端添加大纲/细节页面
请参阅 客户订单数据库示例。