【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 语句。

posted @ 2015-09-11 20:48 h82258652 阅读(...) 评论(...) 编辑 收藏