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

如何在Android Studio中开发一个简单的Android应用?

Android Studio是开发Android应用的官方集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了许多强大的功能&#xff0c;使得开发者能够高效地创建Android应用。如果你是Android开发的初学者&#xff0c;本文将引导你如何在Android Studio中开发一个简单的Android应用…...

ubuntu下迁移docker文件夹

在 Ubuntu 系统中迁移 Docker 文件夹&#xff08;如 Docker 数据存储文件夹 /var/lib/docker&#xff09;到另一个磁盘或目录&#xff0c;通常是为了释放系统盘空间。以下是迁移过程的详细步骤&#xff1a; 1. 停止 Docker 服务 在进行迁移之前&#xff0c;必须停止 Docker 服…...

嵌入式面试题 C/C++常见面试题整理_7

一.什么函数不能声明为虚函数? 常见的不能声明为虚函数的有:普通函数(非成员函数):静态成员函数;内联成员函数;构造函数;友元函数。 1.为什么C不支持普通函数为虚函数?普通函数(非成员函数)只能被overload&#xff0c;不能被override&#xff0c;声明为虚函数也没有什么意思…...

使用OBS推流,大华摄像头 srs服务器播放

说明&#xff1a; ffmpeg可以推流&#xff0c;但是是命令行方式不太友好&#xff0c;还可以使用主流的OBS开源推流软件&#xff0c;可从官网Open Broadcaster Software | OBS 下载最新版本&#xff0c;目前很多网络主播都是用它做直播。该软件支持本地视频文件以及摄像头推流。…...

CSS 组合选择符详解与实战示例

在 Web 开发过程中&#xff0c;CSS 用于定义页面元素的样式&#xff0c;而选择器则帮助我们精确定位需要添加样式的元素。今天我们主要来讲解 CSS 中的组合选择符&#xff0c;它们能够根据 DOM 结构中元素之间的关系来选中目标元素&#xff0c;从而写出结构清晰、易于维护的 CS…...

Window系统通过Docker本地安装ollama和deepseek

在 Windows 系统上安装 Ollama 和 DeepSeek 的步骤如下&#xff1a; 安装 Ollama 安装 WSL&#xff08;Windows Subsystem for Linux&#xff09;&#xff1a; 如果还没有安装 过WSL的&#xff08;安装过的你直接跳过就行了&#xff09;&#xff0c;可以按照以下步骤进行安装&…...

镜头放大倍率和像素之间的关系

相互独立的特性 镜头放大倍率&#xff1a;主要取决于镜头的光学设计和结构&#xff0c;决定了镜头对物体成像时的缩放程度&#xff0c;与镜头的焦距等因素密切相关。比如&#xff0c;微距镜头具有较高的放大倍率&#xff0c;能将微小物体如昆虫、花朵细节等放大成像&#xff0…...

P3413 SAC#1 - 萌数

题目背景 本题由世界上最蒟蒻的 SOL 提供。 寂月城网站是完美信息教室的官网。地址:http://191.101.11.174/mgzd。 题目描述 蒟蒻 SOL 居然觉得数很萌! 好在在他眼里,并不是所有数都是萌的。只有满足“存在长度至少为 22 的回文子串”的数是萌的——也就是说,101 是萌…...

[RabbitMQ] RabbitMQ常见面试题

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

Java运行时数据区

JVM主要流程包括三部分&#xff1a; 首先是 ClassLoard 类加载器&#xff0c;加载数据源文件到jvm当中然后将加载好的数据存放在运行时数据区最后由引擎进行解释和编译的工作 1.Java 内存区域&#xff1a; 1.1 程序计数器 程序计数器&#xff08;Program Counter Register&a…...