当前位置: 首页 > 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国内镜像下载…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...