UWPDemo(二)创建一个简单MVVM模式的UWP应用——SQLite在UWP中的使用
前言:
接着前篇文章UWPDemo(一)写啊!
上次我们实现的是采用MVVM模式的UWP应用的创建和实现简单的页面跳转,
今天主要写SQLite数据库在UWP应用中的使用。
SQLite
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2015年已经有15个年头,SQLite也迎来了一个版本 SQLite 3已经发布。
将SQLite引入到项目中
将SQLite引入的方法有很多中,而且SQLite版本也有很多种这里我采用的是:
引入方法:
1.在外部添加SQLite的扩展,就是在官网下载SQLite的扩展包,SQLite官网;
将下好的扩展安装好后在项目的引用右击添加引用;
2.再在项目中的引用中添加NuGet包,包名SQLite.Net-Pcl;
3.最后添加完后在项目的引用中会多俩个文件,如图:
在Model层添加建表的代码
这里建立了一个user表,由 id,username,password组成
注意要引入命名空间:
using SQLite.Net.Attributes;
完整代码:
using System;
using SQLite.Net.Attributes;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UWPDemo.Models
{
//用户表
[Table("User")]
public class User
{
private int id;
private string username;
private string password;
[PrimaryKey, AutoIncrement][NotNull]
public int Id
{
get => id;
set => id = value;
}
public string Username
{
get => username;
set
{
username = value;
}
}
public string Password
{
get => password;
set
{
password = value;
}
}
}
}
添加数据库初始化操作,和对应数据库操作
我将数据库的操作放在一个新建的Contorl文件夹中代码文件为DBHelper.cs
如图:上一张图
SQLite为轻量级的数据库连接到数据库的操作不同于MYSQL的用户名和密码的连接,
它是根据数据库在你的电脑中的路径进行连接
SQLiteConnection conn = new SQLiteConnection(new SQLitePlatformWinRT(), dBPath)
初始化数据库的操作为如下代码:
private static string DbFilename;
private static string dBPath;
public static string DbFilename1 { get => DbFilename; set => DbFilename = value; }
public static string DBPath { get => dBPath; }
public static void SetDBFilename(string Filename)
{
if (string.IsNullOrEmpty(Filename) && string.IsNullOrWhiteSpace(Filename))
{
throw new ArgumentNullException("操作数据库名称不合法!");
}
else
{
DbFilename1 = Filename;
dBPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, DbFilename1);
}
}
/// <summary>
/// 初始化数据库
/// </summary>
/// <param name="DBFilename">数据库名称</param>
public static void InitDB(string DBFilename)
{
SetDBFilename(DBFilename);
// ApplicationData.Current.LocalFolder.Path balabala的指的是这个位置 ->C:\Users\xiao22805378\AppData\Local\Packages\92211ab1-5481-4a1a-9111-a3dd87b81b72_8zmgqd0netmce\LocalState\
if (!File.Exists(dBPath))
{
// ApplicationData.Current.LocalFolder.Path balabala的指的是这个位置 ->C:\Users\xiao22805378\AppData\Local\Packages\92211ab1-5481-4a1a-9111-a3dd87b81b72_8zmgqd0netmce\LocalState\
using (SQLiteConnection conn = new SQLiteConnection(new SQLitePlatformWinRT(), dBPath))
{
conn.CreateTable<User>();//创建数据表user
}
}
}
数据库初始化在路径
**C:\Users\xiao22805378\AppData\Local\Packages\92211ab1-5481-4a1a-9111a3dd87b81b72_8zmgqd0netmce\LocalState**
生成一个SQLite的数据库里面包含一张user表
定义操作数据库的三个操作:
public static int InsertOneUser(User user)//向数据表插入一条数据
{
int result = -1;
using (SQLiteConnection conn = new SQLiteConnection(new SQLitePlatformWinRT(), dBPath))
{
result = conn.Insert(user);
}
return result;
}
/// <summary>
/// 返回所有的用户
/// </summary>
/// <returns></returns>
public static List<User> GetAllUser()
{
List<User> r;
using (SQLiteConnection conn = new SQLiteConnection(new SQLitePlatformWinRT(), dBPath))
{
r = conn.Table<User>().ToList<User>();
}
return r;
}
/// <summary>
/// 根据记录Username获取用户信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public static User GetUserByUsername(string Username)
{
User l;
using (SQLiteConnection conn = new SQLiteConnection(new SQLitePlatformWinRT(), DBHelper.DBPath))
{
try
{
l = conn.Table<User>().Where(v => v.Username == Username).ToList<User>()[0];
}
catch
{
l = new User();
}
}
return l;
}
重点:
初始化操作定义好后我们在什么时候进行数据库的初始化嘞?
我将初始化放在**App.xaml.cs**App初始化的时候一并初始化
既先引用DBHelper.cs的命名空间:
using UWPDemo.Models;
在构造函数中加入:
DBHelper.InitDB("UWPDemo.db");
然后运行后就会生成:
最后:
既然数据库建好了,数据库的操作也定义好了,现在就在登陆和注册页面的后台(ViewModel层)对数据库进行简单的操作:
public async Task Register_Click()
{
//RegisterPage registerPage = new RegisterPage();
SQLiteConnection conn = new SQLiteConnection(new SQLitePlatformWinRT(), DBHelper.DBPath);
if (username.Length < 6)
{
await termsOfUseContentDialog.ShowAsync();
}
if (Password.Length < 6)
{
var dialog = new MessageDialog("密码少于六位!", "提示");
dialog.Commands.Add(new UICommand("确定", cmd => { }, commandId: 0));
dialog.Commands.Add(new UICommand("取消", cmd => { }, commandId: 1));
//设置默认按钮,不设置的话默认的确认按钮是第一个按钮
dialog.DefaultCommandIndex = 0;
dialog.CancelCommandIndex = 1;
await dialog.ShowAsync();
return;
}
if (Password != Confirm)
{
var dialog = new MessageDialog("两次密码输入不相同!", "提示");
dialog.Commands.Add(new UICommand("确定", cmd => { }, commandId: 0));
dialog.Commands.Add(new UICommand("取消", cmd => { }, commandId: 1));
//设置默认按钮,不设置的话默认的确认按钮是第一个按钮
dialog.DefaultCommandIndex = 0;
dialog.CancelCommandIndex = 1;
await dialog.ShowAsync();
return;
}
User user = DBHelper.GetUserByUsername(Username);
if(user.Id != 0)
{
var dialog = new MessageDialog("用户已存在!", "提示");
dialog.Commands.Add(new UICommand("确定", cmd => { }, commandId: 0));
dialog.Commands.Add(new UICommand("取消", cmd => { }, commandId: 1));
//设置默认按钮,不设置的话默认的确认按钮是第一个按钮
dialog.DefaultCommandIndex = 0;
dialog.CancelCommandIndex = 1;
await dialog.ShowAsync();
return;
}
else
{
User user1 = new User(){
Username = username,
Password = password};
DBHelper.InsertOneUser(user1);
var dialog = new MessageDialog("注册成功", "提示");
dialog.Commands.Add(new UICommand("确定", cmd => { }, commandId: 0));
dialog.Commands.Add(new UICommand("取消", cmd => { }, commandId: 1));
//设置默认按钮,不设置的话默认的确认按钮是第一个按钮
dialog.DefaultCommandIndex = 0;
dialog.CancelCommandIndex = 1;
var result = await dialog.ShowAsync();
}
}
这里代码我写的有点重复,采用dialog的弹窗不太好,等下次再改!
最后后:GitHub地址
上一篇: Vue入门-初识与数据绑定