【Win10】在应用中使用 SQLite 数据库
2015-09-11 20:48
387 查看
在绝大多数应用中,免不了要做的一项就是设置这样的本地数据存储。简单的数据存储我们可以使用 LocalSettings 或者 IsolatedStorageFile(独立存储)等等的方式来进行本地数据存储。但是,如果数据比较复杂,或者是存在关联关系的情况下,这种简单的键值存储方式是不够用的。这时候就需要用到数据库来进行存储。说到数据库,小型、轻量基于文件的 SQLite 就很适合在这种场合使用。
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204705419-214821288.png)
安装上面这个 SQLite for Universal App Platform 扩展。等待安装完成后,重新启动 Visual Studio。
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204706372-1152288140.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204707778-1001127416.png)
按照图片中的步骤,找到 SQLite for Universal App Platform,并勾选,然后按右下角的确定按钮。
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204708731-810149900.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204710340-1446629158.png)
或者可以直接在程序包管理器控制台键入:Install-Package SQLite.Net-PCL 来进行安装。
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204711262-1856040583.png)
需要注意的是,MaxLengthAttribute 所在的命名空间是 SQLite.Net.Attributes,而不是 .Net 框架里的 System.ComponentModel.DataAnnotations。
程序运行起来后,我们先添加几个数据:
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204712122-1963101076.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204713137-1041942663.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204714028-557961985.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204714856-293146345.png)
添加完这 4 个数据之后,我们点击查询按钮。
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204715887-1821412796.png)
好像没什么问题。慢着,我们的 Person 模型不是在 Name 属性上标注了 MaxLength 为 5 的吗?为什么阿历山大大帝还在?!(阿力山大大帝:我怎么躺枪了)
查阅园子里的资料得知:
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204717184-1163611074.png)
新知识点 GET!
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204717997-1982352531.gif)
(这问题之前一直没怎么留意过……)
所以要判断的话,只能在插入数据前判断了。
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204718919-1494036248.png)
将包名这串字符串复制下来。
打开文件浏览器,路径输入 %USERPROFILE%\AppData\Local\Packages\
然后在右上角搜索刚刚复制的包名。
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204720262-79529746.png)
打开这个文件夹。
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204721512-1098917440.png)
然后打开 LocalState 这个文件夹,里面可以发现一个 test.db 的文件,这就是我们的数据库了。
然后我们把它复制出来,并用 SQLite 数据库软件打开它,这里我使用的是 SQLiteStudio,百毒一下就有它的官方网站了。
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204722544-667405087.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204723653-1876383150.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204724747-673403689.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204725840-1191848943.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204726778-60609788.png)
按上面的步骤的话,就能够看到我们定义的 Person 类所对应的表结构了。
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204727840-334992366.png)
而且也能看见我们刚刚插入的数据。
②、ORM 爱好者、讨厌 sql 人群。像我这种 sql 不怎么样的就只能抱 ORM 的大腿了。所以如果是 sql 爱好者,请去看 MS-UAP 写的那篇,那篇使用的 SQLite 库是类似 C 的风格,使用传统的 sql 语句。
一、安装 SQLite for Universal App Platform VSIX 扩展
打开菜单栏的工具-扩展与更新,选择左侧的联机选项卡,在右上角搜索框输入 SQLite。![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204705419-214821288.png)
安装上面这个 SQLite for Universal App Platform 扩展。等待安装完成后,重新启动 Visual Studio。
二、在项目中添加引用
1、添加对 SQLite 的引用
新建一个项目(当然在现有项目添加也可以,这里只是演示)。等待新建完成后,添加引用。![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204706372-1152288140.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204707778-1001127416.png)
按照图片中的步骤,找到 SQLite for Universal App Platform,并勾选,然后按右下角的确定按钮。
2、添加 SQLite.Net 的引用
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204708731-810149900.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204710340-1446629158.png)
或者可以直接在程序包管理器控制台键入:Install-Package SQLite.Net-PCL 来进行安装。
3、确保引用无误
确保项目是把这两个包都引用上![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204711262-1856040583.png)
三、开始编码
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。程序运行起来后,我们先添加几个数据:
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204712122-1963101076.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204713137-1041942663.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204714028-557961985.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204714856-293146345.png)
添加完这 4 个数据之后,我们点击查询按钮。
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204715887-1821412796.png)
好像没什么问题。慢着,我们的 Person 模型不是在 Name 属性上标注了 MaxLength 为 5 的吗?为什么阿历山大大帝还在?!(阿力山大大帝:我怎么躺枪了)
查阅园子里的资料得知:
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204717184-1163611074.png)
新知识点 GET!
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204717997-1982352531.gif)
(这问题之前一直没怎么留意过……)
所以要判断的话,只能在插入数据前判断了。
五、查看存储的数据库
首先先打开项目的 Package.appxmanifest 文件,然后选择打包选项卡。![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204718919-1494036248.png)
将包名这串字符串复制下来。
打开文件浏览器,路径输入 %USERPROFILE%\AppData\Local\Packages\
然后在右上角搜索刚刚复制的包名。
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204720262-79529746.png)
打开这个文件夹。
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204721512-1098917440.png)
然后打开 LocalState 这个文件夹,里面可以发现一个 test.db 的文件,这就是我们的数据库了。
然后我们把它复制出来,并用 SQLite 数据库软件打开它,这里我使用的是 SQLiteStudio,百毒一下就有它的官方网站了。
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204722544-667405087.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204723653-1876383150.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204724747-673403689.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204725840-1191848943.png)
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204726778-60609788.png)
按上面的步骤的话,就能够看到我们定义的 Person 类所对应的表结构了。
![](http://images2015.cnblogs.com/blog/484187/201509/484187-20150911204727840-334992366.png)
而且也能看见我们刚刚插入的数据。
六、结语
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 语句。
相关文章推荐
- mysql查看数据库所有外键列表指令
- MySQL 事件跟踪器
- Oracle 学习之 性能优化(十五) ASH、ADDM、AWR
- mysql 技巧
- C# XML导入数据库
- mysql实现多行查询结果合并成一行
- Redis sentinel 主从自动切换配置
- mysql中实现oracle中的full join
- C# 数据库数据导出XML
- hive sql优化
- mysql共享表空间和独立表空间
- SQL资源
- 减少mssql2008数据库的ldf文件
- mysql存储过程对900w数据进行操作测试
- oracle
- aix下cpu丢失2个时Oracle 数据库实例的alert报错
- MYSQL 命令
- Oracle 表
- 结合MongoDB开发LBS应用
- mysql 存储函数和过程的总结