前言

上一章节我们搭建好了EasySQLite的前后端框架,今天我们的主要任务是在后端框架中引入SQLite-net ORM并封装常用方法(SQLiteHelper)。

七天.NET 8操作SQLite入门到实战详细教程

EasySQLite项目源码地址

GitHub地址:https://github.com/YSGStudyHards/EasySQLite

SQLite-net介绍

简单、强大、跨平台的 SQLite 客户端和 .NET 的 ORM。

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开发者带来更多的价值和成长机会。

欢迎加入DotNetGuide技术社区微信交流群

七天.NET 8操作SQLite入门到实战 - 第五天引入SQLite-net ORM并封装常用方法(SQLiteHelper)的更多相关文章

  1. reactjs入门到实战(五)---- props详解

    1>>>基础的props使用     不可修改父属性    getDefaultProps   对于外界/父组件的属性值,无法直接修改,它是只读的. <script type= ...

  2. 【图像处理】OpenCV+Python图像处理入门教程(七)图像形态学操作

    图像形态学主要从图像内提取分量信息,该分量信息通常对表达图像的特征具有重要意义.例如,在车牌号码识别中,能够使用形态学计算其重要特征信息,在进行识别时,只需对这些特征信息运算即可.图像形态学在目标视觉 ...

  3. SQLite入门与分析(二)---设计与概念(续)

    SQLite入门与分析(二)---设计与概念(续)   写在前面:本节讨论事务,事务是DBMS最核心的技术之一.在计算机科学史上,有三位科学家因在数据库领域的成就而获ACM图灵奖,而其中之一Jim G ...

  4. SQLite 入门教程(三)好多约束 Constraints(转)

    转于: SQLite 入门教程(三)好多约束 Constraints 一.约束 Constraints 在上一篇随笔的结尾,我提到了约束, 但是在那里我把它翻译成了限定符,不太准确,这里先更正一下,应 ...

  5. SQLite 入门教程(四)增删改查,有讲究 (转)

    转于: SQLite 入门教程(四)增删改查,有讲究 一.插入数据 INSERT INTO 表(列...) VALUES(值...) 根据前面几篇的内容,我们可以很轻送的创建一个数据表,并向其中插入一 ...

  6. SQLite入门语句之HAVING和DISTINCT

    一.SQLite入门语句之HAVING HAVING 子句允许指定条件来过滤将出现在最终结果中的分组结果. WHERE 子句在所选列上设置条件,而 HAVING 子句则在由 GROUP BY 子句创建 ...

  7. sqlite入门

    SQLite官网: https://www.sqlite.org/index.html 1. 下载请到https://www.sqlite.org/download.html下载相应平台的sqlite ...

  8. SQLite入门与分析(三)---内核概述(2)

    写在前面:本节是前一节内容的后续部分,这两节都是从全局的角度SQLite内核各个模块的设计和功能.只有从全局上把握SQLite,才会更容易的理解SQLite的实现.SQLite采用了层次化,模块化的设 ...

  9. SQLite入门与分析(六)---再谈SQLite的锁

    写在前面:SQLite封锁机制的实现需要底层文件系统的支持,不管是Linux,还是Windows,都提供了文件锁的机制,而这为SQLite提供了强大的支持.本节就来谈谈SQLite使用到的文件锁——主 ...

  10. SQLite 入门教程(一)基本控制台(终端)命令 (转)

    转于: SQLite 入门教程(一)基本控制台(终端)命令 一.基本简介   SQLite 是一个自持的(self-contained).无服务器的.零配置的.事务型的关系型数据库引擎.因为他很小,所 ...

随机推荐

  1. 如何在达梦数据库中追踪慢SQL

    在达梦数据库中,我们可以通过开启日志记录和设置最小执行时间来追踪慢SQL.下面是具体的步骤: 1. 修改dm.ini文件 使用以下命令编辑dm.ini文件: cd /home/dmdba/dmdbms ...

  2. Sealos 国内集群正式上线,可一键运行 LLama2 中文版大模型!

    2023 年 7 月 19 日,MetaAI 宣布开源旗下的 LLama2 大模型,Meta 首席科学家.图灵奖得主 Yann LeCun 在推特上表示 Meta 此举可能将改变大模型行业的竞争格局. ...

  3. 简单的Oracle增删改查笔记

  4. #POWERBI_指标监控(第二部分,周期内下降天数及日期明细)

    在指标监控的第一部分文章中,我们已经讲了,如何用DAX去查询一段周期内连续下降或者上升指标. 需要复习的同学可以点击下方链接: https://www.cnblogs.com/simone331/p/ ...

  5. Markdown 包含其他文件静态渲染工具

    1. 前言 在 GitHub 上写文档,很多时候要插入 uml,像 mermaid 这种可以直接在 GitHub/GitLab 中渲染的一般直接写个 code block 进去,但是这样造成一个问题就 ...

  6. HBuilderX内置终端无法使用不能输入

    找到HBuilderX的目录打开plugins\builtincef3terminal\script找到main.js用记事本或其他什么打开他 把这部分代码替换成这个再重启hbuilderX就可以了 ...

  7. python-手机自动化环境部署

    关于ui-automator,google的官方介绍: https://developer.android.google.cn/training/testing/ui-automator https: ...

  8. 【Unity3D】Cesium加载大地图

    1 前言 ​ Cesium 是一个地球可视化平台和工具链,具有数据切片.数据分发.三维可视等功能. ​ Cesium 支持 JS.Unity.Unreal.O3DE.Omniverse 等平台,框架如 ...

  9. 【Unity3D】Shader Graph节点

    1 前言 ​ Shader Graph 16.0.3 中有 208 个 Node(节点),本文梳理了 Shader Graph 中大部分 Node 的释义,官方介绍详见→Node-Library. ​ ...

  10. Go开发IDE全览:GoLand vs VSCode全面解析

    关注[TechLeadCloud],分享互联网架构.云服务技术的全维度知识.作者拥有10+年互联网服务架构.AI产品研发经验.团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构 ...