当前位置: 首页 > news >正文

C# LiteDB 使用教程

一、引言

在软件开发中,数据存储和管理是至关重要的一环。对于小型项目或者对性能和便捷性有较高要求的场景,传统的大型数据库可能显得过于笨重。而 LiteDB 作为一款轻量级的嵌入式 NoSQL 数据库,为开发者提供了一个简洁、高效的解决方案。它完全由 C# 编写,与 .NET 生态系统天然契合,无需额外的服务器进程,非常适合用于桌面应用、移动应用以及物联网设备等。

二、安装 LiteDB

使用 NuGet 包管理器(Visual Studio)

如果你使用的是 Visual Studio 进行开发,可以通过 NuGet 包管理器轻松安装 LiteDB。具体步骤如下:

  1. 右键单击你的项目,选择 “管理 NuGet 程序包”。
  2. 在打开的 NuGet 包管理器窗口中,切换到 “浏览” 选项卡。
  3. 在搜索框中输入 “LiteDB”。
  4. 从搜索结果中选择 “LiteDB”,然后点击 “安装” 按钮。

三、创建和打开数据库

在 LiteDB 中,数据库以文件的形式存在,通常扩展名为 .db。下面是一个简单的示例,展示如何创建或打开一个数据库:

using LiteDB;class Program
{static void Main(){// 创建或打开一个名为 mydatabase.db 的数据库using (var db = new LiteDatabase("mydatabase.db")){// 在这里进行数据库操作}}
}

在上述代码中,LiteDatabase 类的构造函数接受一个数据库文件的路径作为参数。如果指定的文件不存在,LiteDB 会自动创建一个新的数据库文件;如果文件已经存在,则会打开该数据库。

四、数据建模

在 LiteDB 中,数据以文档的形式存储,每个文档可以看作是一个键值对的集合。通常,我们会使用 C# 类来定义数据模型。以下是一个简单的数据模型示例:

public class Person
{[BsonId]public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }
}

在这个示例中,Person 类表示一个人的信息,包含 IdName 和 Age 三个属性。[BsonId] 属性用于标记 Id 作为文档的主键,确保每个文档的唯一性。

五、基本的 CRUD 操作

插入数据

插入数据是将新的文档添加到数据库中的操作。以下是一个插入 Person 对象的示例:

using LiteDB;
using System;class Program
{static void Main(){using (var db = new LiteDatabase("mydatabase.db")){// 获取名为 "persons" 的集合var persons = db.GetCollection<Person>("persons");// 创建一个新的 Person 对象var person = new Person{Name = "John Doe",Age = 30};// 插入 Person 对象到集合中persons.Insert(person);Console.WriteLine("Person inserted successfully.");}}
}

在上述代码中,GetCollection<Person>("persons") 方法用于获取名为 persons 的集合。Insert 方法将 Person 对象插入到集合中。

查询数据

查询数据是从数据库中获取符合特定条件的文档的操作。以下是几种常见的查询方式:

using LiteDB;
using System;class Program
{static void Main(){using (var db = new LiteDatabase("mydatabase.db")){var persons = db.GetCollection<Person>("persons");// 根据主键 查询单个数据var person1 = persons.FindById(1);if (person1 != null){Console.WriteLine($"Name: {person1.Name}, Age: {person1.Age}");}else{Console.WriteLine("Person1 not found.");}//根据名字 查询单个数据var person2 = persons.FindOne(p=> p.Name == "John Doe");if (person2 != null){Console.WriteLine($"Name: {person2.Name}, Age: {person2.Age}");}else{Console.WriteLine("Person2 not found.");}// 查询年龄大于 25 岁的所有人员 多个数据var result = persons.Find(p => p.Age > 25);foreach (var person in result){Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");}}}
}

更新数据

更新数据是修改数据库中已有文档的操作。以下是一个更新 Person 对象信息的示例:

using LiteDB;
using System;class Program
{static void Main(){using (var db = new LiteDatabase("mydatabase.db")){var persons = db.GetCollection<Person>("persons");// 根据主键查询要更新的文档var person = persons.FindById(1);if (person != null){// 更新人员信息person.Age = 31;// 更新文档到集合中persons.Update(person);Console.WriteLine("Person updated successfully.");}else{Console.WriteLine("Person not found.");}}}
}

删除数据

删除数据是从数据库中移除符合特定条件的文档的操作。以下是一个删除 Person 对象的示例:

using LiteDB;
using System;class Program
{static void Main(){using (var db = new LiteDatabase("mydatabase.db")){var persons = db.GetCollection<Person>("persons");// 根据主键删除单个文档var result = persons.Delete(1);if (result){Console.WriteLine("Person deleted successfully.");}else{Console.WriteLine("Person not found.");}// 根据名字 删除单个var deleteResult = persons.Delete(w => w.Name == "John Doe");if (deleteResult){Console.WriteLine("Person deleted successfully.");}else{Console.WriteLine("Person not found.");}}}
}

六、索引的使用

索引可以显著提高查询性能,尤其是在处理大量数据时。在 LiteDB 中,可以为集合中的某个字段创建索引。以下是一个为 Person 集合的 Name 字段创建索引的示例:

using LiteDB;class Program
{static void Main(){using (var db = new LiteDatabase("mydatabase.db")){var persons = db.GetCollection<Person>("persons");// 为 Name 字段创建唯一索引persons.EnsureIndex(x => x.Name, true);// 现在查询 Name 字段时会更快var result = persons.Find(p => p.Name == "John Doe");}}
}

在上述代码中,EnsureIndex 方法用于创建索引。第一个参数指定要创建索引的字段,第二个参数表示是否为唯一索引。

七、事务处理

事务是一组数据库操作,这些操作要么全部成功,要么全部失败。在 LiteDB 中,可以使用事务来确保数据的一致性。以下是一个简单的事务处理示例:

using LiteDB;
using System;class Program
{static void Main(){using (var db = new LiteDatabase("mydatabase.db")){var persons = db.GetCollection<Person>("persons");// 开始一个事务using (var trans = db.BeginTrans()){try{// 插入一个新的 Person 对象var person = new Person{Name = "Jane Smith",Age = 25};persons.Insert(person);// 更新另一个 Person 对象的信息var updatePerson = persons.FindById(1);if (updatePerson != null){updatePerson.Age = 32;persons.Update(updatePerson);}// 提交事务trans.Commit();Console.WriteLine("Transaction committed successfully.");}catch (Exception ex){// 回滚事务trans.Rollback();Console.WriteLine($"Transaction rolled back: {ex.Message}");}}}}
}

在上述代码中,BeginTrans 方法用于开始一个事务,Commit 方法用于提交事务,Rollback 方法用于回滚事务。

八、总结

通过本教程,你已经了解了 LiteDB 的基本使用方法,包括安装、创建数据库、数据建模、CRUD 操作、索引的使用和事务处理等。LiteDB 以其轻量级、嵌入式和易用性的特点,为开发者提供了一个高效的数据存储解决方案。在实际项目中,你可以根据具体需求进一步探索 LiteDB 的高级功能,如数据加密、文件存储等。希望本教程能帮助你更好地使用 LiteDB 进行数据管理。

附件测试源码及数据库可视化软件:

我使用的liteDB版本为V 5.0.15版本,对应的图形可视化软件版V 5.0.15。

源码链接: https://pan.baidu.com/s/1XGseqtzeBJ7OzKwl1KJYHQ?pwd=wi59 提取码: wi59 

数据库可视化软件链接: https://pan.baidu.com/s/1Qs4jnsASE8U7Syq0oM40wg?pwd=y8ee 提取码: y8ee 

相关文章:

C# LiteDB 使用教程

一、引言 在软件开发中&#xff0c;数据存储和管理是至关重要的一环。对于小型项目或者对性能和便捷性有较高要求的场景&#xff0c;传统的大型数据库可能显得过于笨重。而 LiteDB 作为一款轻量级的嵌入式 NoSQL 数据库&#xff0c;为开发者提供了一个简洁、高效的解决方案。它…...

Python Pandas(3):DataFrame

1 介绍 DataFrame 是 Pandas 中的另一个核心数据结构&#xff0c;类似于一个二维的表格或数据库中的数据表。它含有一组有序的列&#xff0c;每列可以是不同的值类型&#xff08;数值、字符串、布尔型值&#xff09;。DataFrame 既有行索引也有列索引&#xff0c;它可以被看做由…...

使用通义灵码 ai编程 来提高开发效率

1、我们先新建一个Hello&#xff0c;world的vue3项目&#xff08;快速上手 | Vue.js&#xff09; 创建好以后&#xff0c;运行以下界面&#xff1a; about界面如下&#xff0c;现在我们让灵码给我们修改一下这个字体的颜色及加点其它的样式&#xff1a; 2、先选中样式&#xf…...

【OpenCV】入门教学

&#x1f3e0;大家好&#xff0c;我是Yui_&#x1f4ac; &#x1f351;如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一起进步&#x1f440; &#x1f680;如有不懂&#xff0c;可以随时向我提问&#xff0c;我会全力讲解~ &#x1f52…...

大数据项目4:基于spark的智慧交通项目设计与实现

项目概述 项目直达 www.baiyuntu.com 随着交通数据的快速增长&#xff0c;传统的交通管理方式已无法满足现代城市的需求。交通大数据分析系统通过整合各类交通数据&#xff0c;利用大数据技术解决交通瓶颈问题&#xff0c;提升交通管理效率。本项目旨在通过大数据技术&#…...

netcore openTelemetry+prometheus+grafana

一、netcore项目 二、openTelemetry 三、prometheus 四、grafana添加Dashborad aspire/src/Grafana/dashboards at main dotnet/aspire GitHub 导入&#xff1a;aspnetcore.json和aspnetcore-endpoint.json 效果&#xff1a;...

Spring Boot接入Deep Seek的API

1&#xff0c;首先进入deepseek的官网&#xff1a;DeepSeek | 深度求索&#xff0c;单击右上角的API开放平台。 2&#xff0c;单击API keys&#xff0c;创建一个API&#xff0c;创建完成务必复制&#xff01;&#xff01;不然关掉之后会看不看api key&#xff01;&#xff01;&…...

Git、Github和Gitee完整讲解:丛基础到进阶功能

第一部分&#xff1a;Git 是什么&#xff1f; 比喻&#xff1a;Git就像是一本“时光机日记本” 每一段代码的改动&#xff0c;Git都会帮你记录下来&#xff0c;像是在写日记。如果出现问题或者想查看之前的版本&#xff0c;Git可以带你“穿越回过去”&#xff0c;找到任意时间…...

MyBatis的工作流程是怎样的?

大家好&#xff0c;我是锋哥。今天分享关于【MyBatis的工作流程是怎样的&#xff1f;】面试题。希望对大家有帮助&#xff1b; MyBatis的工作流程是怎样的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MyBatis 的工作流程可以分为几个主要的步骤&…...

Maven 安装配置(完整教程)

文章目录 一、Maven 简介二、下载 Maven三、配置 Maven3.1 配置环境变量3.2 Maven 配置3.3 IDEA 配置 四、结语 一、Maven 简介 Maven 是一个基于项目对象模型&#xff08;POM&#xff09;的项目管理和自动化构建工具。它主要服务于 Java 平台&#xff0c;但也支持其他编程语言…...

分享如何通过Mq、Redis、XxlJob实现算法任务的异步解耦调度

一、背景 1.1 产品简介 基于大模型塔斯&#xff0c;整合传统的多项能力&#xff08;NLP、OCR、CV等&#xff09;&#xff0c;构建以场景为中心的新型智能文档平台。通过文档审阅&#xff0c;实现结构化、半结构化和非结构化文档的信息获取、处理及审核&#xff0c;同时基于大…...

发布:大彩科技DN系列2.8寸高性价比串口屏发布!

一、产品介绍 该产品是一款2.8寸的工业组态串口屏&#xff0c;采用2.8寸液晶屏&#xff0c;分辨率为240*320&#xff0c;支持电阻触摸、电容触摸、无触摸。可播放动画&#xff0c;带蜂鸣器&#xff0c;默认为RS232通讯电平&#xff0c;用户短接屏幕PCB上J5短接点即可切换为TTL电…...

集合类不安全问题

ArrayList不是线程安全类&#xff0c;在多线程同时写的情况下&#xff0c;会抛出java.util.ConcurrentModificationException异常 解决办法&#xff1a; 1.使用Vector&#xff08;ArrayList所有方法加synchronized&#xff0c;太重&#xff09; 2.使用Collections.synchronized…...

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之上传头像和新增收货地址

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【Spring篇】【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f680;1.上传头像 -持久…...

AI知识库和全文检索的区别

1、AI知识库的作用 AI知识库是基于人工智能技术构建的智能系统&#xff0c;能够理解、推理和生成信息。它的核心作用包括&#xff1a; 1.1 语义理解 自然语言处理&#xff08;NLP&#xff09;&#xff1a;AI知识库能够理解用户查询的语义&#xff0c;而不仅仅是关键词匹配。 …...

20240817 联想 笔试

文章目录 1、选择题1.11.21.31.41.51.61.71.81.91.101.111.121.131.141.151.161.171.181.191.202、编程题2.12.2岗位:Linux开发工程师 题型:20 道选择题,2 道编程题 1、选择题 1.1 有如下程序,程序运行的结果为 (D) #include <stdio.h>int main() {int k = 3...

IntelliJ IDEA 安装与使用完全教程:从入门到精通

一、引言 在当今竞争激烈的软件开发领域&#xff0c;拥有一款强大且高效的集成开发环境&#xff08;IDE&#xff09;是开发者的致胜法宝。IntelliJ IDEA 作为 JetBrains 公司精心打造的一款明星 IDE&#xff0c;凭借其丰富多样的功能、智能精准的代码提示以及高效便捷的开发工…...

【JVM详解一】类加载过程与内存区域划分

一、简介 1.1 概述 JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关…...

250207-MacOS修改Ollama模型下载及运行的路径

在 macOS 上&#xff0c;Ollama 默认将模型存储在 ~/.ollama/models 目录。如果您希望更改模型的存储路径&#xff0c;可以通过设置环境变量 OLLAMA_MODELS 来实现。具体步骤如下&#xff1a; 选择新的模型存储目录&#xff1a;首先&#xff0c;确定您希望存储模型的目标目录路…...

Win10 部署llama Factory 推荐教程和遇到的问题

教程 【大模型微调】使用Llama Factory实现中文llama3微调_哔哩哔哩_bilibili 大模型微调&#xff01;手把手带你用LLaMA-Factory工具微调Qwen大模型&#xff01;有手就行&#xff0c;零代码微调任意大语言模型_哔哩哔哩_bilibili 遇到问题解决办法 pytorch gpu国内镜像下载…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...