欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

UWPDemo(二)创建一个简单MVVM模式的UWP应用——SQLite在UWP中的使用

程序员文章站 2024-01-28 17:11:10
...

前言:

接着前篇文章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官网
将下好的扩展安装好后在项目的引用右击添加引用;
UWPDemo(二)创建一个简单MVVM模式的UWP应用——SQLite在UWP中的使用
2.再在项目中的引用中添加NuGet包,包名SQLite.Net-Pcl;
UWPDemo(二)创建一个简单MVVM模式的UWP应用——SQLite在UWP中的使用
3.最后添加完后在项目的引用中会多俩个文件,如图:
UWPDemo(二)创建一个简单MVVM模式的UWP应用——SQLite在UWP中的使用

在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");

然后运行后就会生成:
UWPDemo(二)创建一个简单MVVM模式的UWP应用——SQLite在UWP中的使用

最后:

既然数据库建好了,数据库的操作也定义好了,现在就在登陆和注册页面的后台(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地址

这里