七天.NET 8操作SQLite入门到实战 - 第五天引入SQLite-net ORM并封装常用方法(SQLiteHelper)
前言
上一章节我们搭建好了EasySQLite的前后端框架,今天我们的主要任务是在后端框架中引入SQLite-net ORM并封装常用方法(SQLiteHelper)。
七天.NET 8操作SQLite入门到实战详细教程
EasySQLite项目源码地址
SQLite-net介绍
简单、强大、跨平台的 SQLite 客户端和 .NET 的 ORM。
- GitHub开源地址:https://github.com/praeclarum/sqlite-net
SQLite-net提供了以下四个包:
| Package | Description | Package Address |
|---|---|---|
| sqlite-net-pcl | .NET Standard 库 | https://www.nuget.org/packages/sqlite-net-pcl |
| sqlite-net-sqlcipher | 支持加密 | https://www.nuget.org/packages/sqlite-net-sqlcipher |
| sqlite-net-static | 使用平台提供的 sqlite3 的 P/Invokes 的特殊版本 | https://www.nuget.org/packages/sqlite-net-static |
| sqlite-net-base | 使用 SQLitePCLRaw 捆绑包,以便您可以选择自己的提供程序 | https://www.nuget.org/packages/sqlite-net-base |
SQLite-net 设计目标
SQLite-net 被设计为一个快速便捷的数据库层。其设计遵循以下目标:
- 非常容易与现有项目集成,并在所有 .NET 平台上运行。
- 对 SQLite 的薄包装,快速高效。(这个库不应该成为查询性能的瓶颈。)
- 提供非常简单的方法来安全执行 CRUD 操作和查询(使用参数),以及以强类型方式检索这些查询结果。
- 在不强制更改类的情况下与数据模型一起工作。(包含一个小型的反射驱动 ORM 层。)
安装 sqlite-net-pcl Nuget包

搜索sqlite-net-pcl,选择最新稳定版本进行安装:

SQLite同步和异步方法帮助类
SQLiteHelper
/// <summary>
/// SQLite同步方法帮助类
/// 作者:追逐时光者
/// 创建时间:2023年11月30日
/// </summary>
/// <typeparam name="T"></typeparam>
public class SQLiteHelper<T> where T : new()
{
private readonly string _databasePath = Path.Combine(Environment.CurrentDirectory, "ClassManagement.db");
private readonly SQLiteConnection _connection; // SQLite连接对象
/// <summary>
/// 构造函数
/// </summary>
public SQLiteHelper()
{
// 创建SQLite连接对象并打开连接
_connection = new SQLiteConnection(_databasePath);
_connection.CreateTable<T>(); // 如果表不存在,则创建该表[不会创建重复的表]
}
/// <summary>
/// 数据插入
/// </summary>
/// <param name="item">要插入的数据项</param>
/// <returns></returns>
public int Insert(T item)
{
return _connection.Insert(item);
}
/// <summary>
/// 数据删除
/// </summary>
/// <param name="id">要删除的数据的主键ID</param>
/// <returns></returns>
public int Delete(int id)
{
return _connection.Delete<T>(id);
}
/// <summary>
/// 数据更新
/// </summary>
/// <param name="item">要更新的数据项</param>
/// <returns></returns>
public int Update(T item)
{
return _connection.Update(item);
}
/// <summary>
/// 根据条件查询记录
/// </summary>
/// <param name="predExpr">查询条件</param>
/// <returns></returns>
public List<T> Query(Expression<Func<T, bool>> predExpr)
{
return _connection.Table<T>().Where(predExpr).ToList();
}
/// <summary>
/// 查询所有数据
/// </summary>
/// <returns></returns>
public List<T> QueryAll()
{
return _connection.Table<T>().ToList();
}
/// <summary>
/// 根据条件查询单条记录
/// </summary>
/// <param name="predExpr">查询条件</param>
/// <returns></returns>
public T QuerySingle(Expression<Func<T, bool>> predExpr)
{
return _connection.Table<T>().Where(predExpr).FirstOrDefault();
}
}
SQLiteAsyncHelper
/// <summary>
/// SQLite异步方法帮助类
/// 作者:追逐时光者
/// 创建时间:2023年11月30日
/// </summary>
/// <typeparam name="T"></typeparam>
public class SQLiteAsyncHelper<T> where T : new()
{
private readonly string _databasePath = Path.Combine(Environment.CurrentDirectory, "ClassManagement.db");
private readonly SQLiteAsyncConnection _connectionAsync; // SQLite连接对象
/// <summary>
/// 构造函数
/// </summary>
public SQLiteAsyncHelper()
{
// 创建SQLite连接对象并打开连接
_connectionAsync = new SQLiteAsyncConnection(_databasePath);
_connectionAsync.CreateTableAsync<T>(); // 如果表不存在,则创建该表[不会创建重复的表]
}
/// <summary>
/// 数据插入
/// </summary>
/// <param name="item">要插入的数据项</param>
/// <returns></returns>
public async Task<int> InsertAsync(T item)
{
return await _connectionAsync.InsertAsync(item);
}
/// <summary>
/// 数据删除
/// </summary>
/// <param name="id">要删除的数据的主键ID</param>
/// <returns></returns>
public async Task<int> DeleteAsync(int id)
{
return await _connectionAsync.DeleteAsync<T>(id);
}
/// <summary>
/// 数据更新
/// </summary>
/// <param name="item">要更新的数据项</param>
/// <returns></returns>
public async Task<int> UpdateAsync(T item)
{
return await _connectionAsync.UpdateAsync(item);
}
/// <summary>
/// 根据条件查询记录
/// </summary>
/// <param name="predExpr">查询条件</param>
/// <returns></returns>
public async Task<List<T>> QueryAsync(Expression<Func<T, bool>> predExpr)
{
return await _connectionAsync.Table<T>().Where(predExpr).ToListAsync();
}
/// <summary>
/// 查询所有数据
/// </summary>
/// <returns></returns>
public async Task<List<T>> QueryAllAsync()
{
return await _connectionAsync.Table<T>().ToListAsync();
}
/// <summary>
/// 根据条件查询单条记录
/// </summary>
/// <param name="predExpr">查询条件</param>
/// <returns></returns>
public async Task<T> QuerySingleAsync(Expression<Func<T, bool>> predExpr)
{
return await _connectionAsync.Table<T>().Where(predExpr).FirstOrDefaultAsync();
}
}
DotNetGuide技术社区交流群
- DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目推荐、招聘资讯和解决问题的平台。
- 在这个社区中,开发者们可以分享自己的技术文章、项目经验、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
- 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台,为广大.NET开发者带来更多的价值和成长机会。
七天.NET 8操作SQLite入门到实战 - 第五天引入SQLite-net ORM并封装常用方法(SQLiteHelper)的更多相关文章
- reactjs入门到实战(五)---- props详解
1>>>基础的props使用 不可修改父属性 getDefaultProps 对于外界/父组件的属性值,无法直接修改,它是只读的. <script type= ...
- 【图像处理】OpenCV+Python图像处理入门教程(七)图像形态学操作
图像形态学主要从图像内提取分量信息,该分量信息通常对表达图像的特征具有重要意义.例如,在车牌号码识别中,能够使用形态学计算其重要特征信息,在进行识别时,只需对这些特征信息运算即可.图像形态学在目标视觉 ...
- SQLite入门与分析(二)---设计与概念(续)
SQLite入门与分析(二)---设计与概念(续) 写在前面:本节讨论事务,事务是DBMS最核心的技术之一.在计算机科学史上,有三位科学家因在数据库领域的成就而获ACM图灵奖,而其中之一Jim G ...
- SQLite 入门教程(三)好多约束 Constraints(转)
转于: SQLite 入门教程(三)好多约束 Constraints 一.约束 Constraints 在上一篇随笔的结尾,我提到了约束, 但是在那里我把它翻译成了限定符,不太准确,这里先更正一下,应 ...
- SQLite 入门教程(四)增删改查,有讲究 (转)
转于: SQLite 入门教程(四)增删改查,有讲究 一.插入数据 INSERT INTO 表(列...) VALUES(值...) 根据前面几篇的内容,我们可以很轻送的创建一个数据表,并向其中插入一 ...
- SQLite入门语句之HAVING和DISTINCT
一.SQLite入门语句之HAVING HAVING 子句允许指定条件来过滤将出现在最终结果中的分组结果. WHERE 子句在所选列上设置条件,而 HAVING 子句则在由 GROUP BY 子句创建 ...
- sqlite入门
SQLite官网: https://www.sqlite.org/index.html 1. 下载请到https://www.sqlite.org/download.html下载相应平台的sqlite ...
- SQLite入门与分析(三)---内核概述(2)
写在前面:本节是前一节内容的后续部分,这两节都是从全局的角度SQLite内核各个模块的设计和功能.只有从全局上把握SQLite,才会更容易的理解SQLite的实现.SQLite采用了层次化,模块化的设 ...
- SQLite入门与分析(六)---再谈SQLite的锁
写在前面:SQLite封锁机制的实现需要底层文件系统的支持,不管是Linux,还是Windows,都提供了文件锁的机制,而这为SQLite提供了强大的支持.本节就来谈谈SQLite使用到的文件锁——主 ...
- SQLite 入门教程(一)基本控制台(终端)命令 (转)
转于: SQLite 入门教程(一)基本控制台(终端)命令 一.基本简介 SQLite 是一个自持的(self-contained).无服务器的.零配置的.事务型的关系型数据库引擎.因为他很小,所 ...
随机推荐
- 【LaTeX】环境配置以及中文支持
目录 网页环境 Overleaf 本地环境 TeX Live TeXstudio VSCode 安装 LaTeX Workshop 扩展 编译链配置 正向同步 反向同步 其他可选配置 中文支持 XeL ...
- 使用Skonsole自动生成Git提交信息
使用Skonsole自动生成Git提交信息 随着LLM应用的普及,日常工作中的很多使用都可以使用LLM来完成,比如Git提交信息的生成. Skonsole是一个基于Semantic Kernel的命令 ...
- Api接口如何防止被刷?
当今,越来越多的应用程序和服务都提供了API接口,使得开发人员可以方便地与这些应用程序和服务进行交互.但是,由于API接口是公开的,因此很容易被黑客利用,对系统造成损害.为了确保API接口的安全性 ...
- Go之流程控制大全: 细节、示例与最佳实践
本文深入探讨Go语言中的流程控制语法,包括基本的if-else条件分支.for循环.switch-case多条件分支,以及与特定数据类型相关的流程控制,如for-range循环和type-switch ...
- 通过 Haproxy 实现 ss 负载均衡
介绍 缺点:所有的SS的加密方式和密码必须一致 介绍:HAProxy是一个使用C语言编写的自由及开放原始码软件,其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理. 安装Haproxy ...
- MySQL系列之备份恢复——运维在备份恢复方面、备份类型、备份方式及工具、逻辑备份和物理备份、备份策略、备份工具使用-mysqldump、企业故障恢复案例、备份时优化参数、MySQL物理备份工具
文章目录 1. 运维在数据库备份恢复方面的职责 1.1 设计备份策略 1.2 日常备份检查 1.3 定期恢复演练(测试库) 1.4 故障恢复 1.5 迁移 2. 备份类型 2.1 热备 2.2 温备 ...
- 第一个 Go 程序"hello,world" 与 main 函数和Go常用基本命令
第一个 Go 程序"hello,world" 与 main 函数和Go常用基本命令 目录 第一个 Go 程序"hello,world" 与 main 函数和Go ...
- oracle数据库性能监控常用sql
因执行时间较长建议使用plsql等第三方工具执行 --1.监控sga内存分配信息select * from v$sgainfo;--2.监控每个用户的磁盘io及io命中率select v$sess_i ...
- nfls10.1
T1 大水题,用位运算更加便捷求解. T2 看出来有环了,但是没往基环树上想,寄. 暴力分,有部分分是基础树,可以跑一遍深搜,根节点的选择是 k 种颜色,剩下的是 k - 1 种颜色.还有暴力是可以二 ...
- 12. 用Rust手把手编写一个wmproxy(代理,内网穿透等), TLS的双向认证信息及token验证
12. 用Rust手把手编写一个wmproxy(代理,内网穿透等), TLS的双向认证信息及token验证 项目 ++wmproxy++ gite: https://gitee.com/tickbh/ ...