欢迎投稿

今日深度:

【Win10】在应用中使用 SQLite 数据库,win10sqlite

【Win10】在应用中使用 SQLite 数据库,win10sqlite


在绝大多数应用中,免不了要做的一项就是设置这样的本地数据存储。简单的数据存储我们可以使用 LocalSettings 或者 IsolatedStorageFile(独立存储)等等的方式来进行本地数据存储。但是,如果数据比较复杂,或者是存在关联关系的情况下,这种简单的键值存储方式是不够用的。这时候就需要用到数据库来进行存储。说到数据库,小型、轻量基于文件的 SQLite 就很适合在这种场合使用。

一、安装 SQLite for Universal App Platform VSIX 扩展

打开菜单栏的工具-扩展与更新,选择左侧的联机选项卡,在右上角搜索框输入 SQLite。

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

www.htsjk.Com true http://www.htsjk.com/SQLite/25511.html NewsArticle 【Win10】在应用中使用 SQLite 数据库,win10sqlite 在绝大多数应用中,免不了要做的一项就是设置这样的本地数据存储。简单的数据存储我们可以使用 LocalSettings 或者 IsolatedStorageFile(独立...
相关文章
    暂无相关文章
评论暂时关闭