LiteDb

news/2025/1/15 6:52:53/文章来源:https://www.cnblogs.com/lanwah/p/18242599

目录
  • 封装的代码
  • 相关参考


本文记录LiteDb的使用,建议初学者使用时先根据官方的文档进行学习。

LookDown LiteDb官网

LookDown LiteDb Doc

LookDown LiteDb Package

LookDownLiteDb API

封装的代码

LiteDbWrapper.cs

    /// <summary>/// 官网:http://www.litedb.org//// GitHub:https://github.com/mbdavid?tab=repositories/// GitHub:https://github.com/mbdavid/LiteDB/// LiteDB连接字符串:http://www.litedb.org/docs/connection-string//// http://www.litedb.org/docs/getting-started//// </summary>public partial class LiteDbWrapper : IDisposable{/// <summary>/// 数据库文件名称/// </summary>public string FilePath{get;private set;}private LiteDatabase _liteDb;/// <summary>/// LiteDb数据库/// </summary>public LiteDatabase LiteDb{get{return this._liteDb;}private set{this._liteDb = value;}}/// <summary>/// 构造函数/// </summary>/// <param name="dbFilePath">数据库文件路径或连接字符串</param>/// <param name="autoInit">是否自动初始化,默认false</param>public LiteDbWrapper(string dbFilePath, bool autoInit = false){this.FilePath = dbFilePath;if (autoInit){this.InitialDb();}}/// <summary>/// 初始化LiteDB/// </summary>public virtual void InitialDb(){if (string.IsNullOrEmpty(this.FilePath)){throw new ArgumentNullException(nameof(this.FilePath));}if (null == this.LiteDb){this.LiteDb = new LiteDatabase(this.FilePath);}}/// <summary>/// 执行数据库操作/// </summary>/// <param name="action"></param>public virtual void Do(Action<LiteDatabase> action){if (null != this.LiteDb){// 长连接action?.Invoke(this.LiteDb);}else{// 短连接using (var db = new LiteDatabase(this.FilePath)){action?.Invoke(db);}}}/// <summary>/// 执行数组对象的操作/// </summary>/// <typeparam name="T"></typeparam>/// <param name="action"></param>/// <param name="name">Collection name (case insensitive)</param>public virtual void Do<T>(Action<ILiteCollection<T>> action, string name = null){if (null != this.LiteDb){// 长连接var col = this.LiteDb.GetCollection<T>(name);action?.Invoke(col);}else{// 短连接using (var db = new LiteDatabase(this.FilePath)){var col = db.GetCollection<T>(name);action?.Invoke(col);}}}/// <summary>/// 释放资源/// </summary>public virtual void Dispose(){if ((null != this.LiteDb)){this.LiteDb.Dispose();}}}public static class LiteDbExtensions{/// <summary>/// 根据Id存储文件,如果文件存在则更新/// </summary>/// <typeparam name="TFileId"></typeparam>/// <param name="db"></param>/// <param name="id"></param>/// <param name="filePath"></param>/// <param name="metaData"></param>/// <returns></returns>public static LiteFileInfo<TFileId> UploadFile<TFileId>(this LiteDatabase db, TFileId id, string filePath, BsonDocument metaData = null){// Get file storage with Int Idvar storage = db.GetStorage<TFileId>();// Upload a file from file system to databasevar liteFileInfo = storage.Upload(id, filePath);if ((null != liteFileInfo) && (null != metaData)){if (storage.Exists(liteFileInfo.Id)){storage.SetMetadata(liteFileInfo.Id, metaData);}}return storage.FindById(liteFileInfo.Id);}/// <summary>/// 根据Id存储文件,如果文件存在则更新/// </summary>/// <typeparam name="TFileId"></typeparam>/// <param name="db"></param>/// <param name="id"></param>/// <param name="fileName"></param>/// <param name="stream"></param>/// <param name="metaData"></param>/// <returns></returns>public static LiteFileInfo<TFileId> UploadFile<TFileId>(this LiteDatabase db, TFileId id, string fileName, Stream stream, BsonDocument metaData = null){// Get file storage with Int Idvar storage = db.GetStorage<TFileId>();// Upload a file from Streamvar liteFileInfo = storage.Upload(id, fileName, stream, metaData);return liteFileInfo;}/// <summary>/// 下载文件/// </summary>/// <param name="db"></param>/// <param name="id"></param>/// <param name="filePath"></param>/// <returns></returns>public static LiteFileInfo<TFileId> DownloadFile<TFileId>(this LiteDatabase db, TFileId id, string filePath){// Get file storage with Int Idvar storage = db.GetStorage<TFileId>();// And download latervar liteFileInfo = storage.Download(id, filePath, true);return liteFileInfo;}/// <summary>/// 下载文件/// </summary>/// <typeparam name="TFileId"></typeparam>/// <param name="db"></param>/// <param name="id"></param>/// <param name="stream"></param>/// <returns></returns>public static LiteFileInfo<TFileId> DownloadFile<TFileId>(this LiteDatabase db, TFileId id, Stream stream){// Get file storage with Int Idvar storage = db.GetStorage<TFileId>();// And download latervar liteFileInfo = storage.Download(id, stream);return liteFileInfo;}/// <summary>/// 删除文件/// </summary>/// <typeparam name="TFileId"></typeparam>/// <param name="db"></param>/// <param name="id"></param>/// <returns></returns>public static bool DeleteFile<TFileId>(this LiteDatabase db, TFileId id){// Get file storage with Idvar storage = db.GetStorage<TFileId>();// And delete file, return true if success, false if not foundreturn storage.Delete(id);}}
RegisterTypeManager.cs

    /// <summary>/// 自定义注册类型接口/// </summary>/// <typeparam name="T"></typeparam>public interface IRegisterType<T>{/// <summary>/// 注册/// </summary>void RegisterType();/// <summary>/// 序列化/// </summary>/// <param name="entity"></param>/// <returns></returns>BsonValue Serialize(T entity);/// <summary>/// 反序列化/// </summary>/// <param name="bsonValue"></param>/// <returns></returns>T Deserialize(BsonValue bsonValue);}public abstract class RegisterTypeBase<T> : IRegisterType<T>{/// <summary>/// 注册/// </summary>public void RegisterType() => BsonMapper.Global.RegisterType<T>(Serialize, Deserialize);/// <summary>/// 序列化/// </summary>/// <param name="entity"></param>/// <returns></returns>public abstract BsonValue Serialize(T entity);/// <summary>/// 反序列化/// </summary>/// <param name="bsonValue"></param>/// <returns></returns>public abstract T Deserialize(BsonValue bsonValue);}public static class RegisterTypeManager{public static void RegisterType<T>(RegisterTypeBase<T> registerType){registerType.RegisterType();}}public class PointMapper : RegisterTypeBase<Point>{public override Point Deserialize(BsonValue bsonValue){var x = bsonValue["X"].AsInt32;var y = bsonValue["Y"].AsInt32;return new Point(x, y);}public override BsonValue Serialize(Point entity){return new BsonDocument(new Dictionary<string, BsonValue>{{"X", entity.X},{"Y", entity.Y},});}}................// 注册自定义序列化/反序列化器RegisterTypeManager.RegisterType(new PointMapper());

相关参考

  1. LiteDB用法小结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/723227.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

winform窗体关闭之前弹出确认框

需要使用到窗体的 FormClosing 事件 private void FrmMain_FormClosing(object sender, FormClosingEventArgs e) {DialogResult dialogResult = MessageBox.Show("是否确认关闭窗口", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);if (…

Oh My Posh 安装与使用

Oh My Posh 安装与使用 目录Oh My Posh 安装与使用IntroductionInstallationThemes配置使用主题安装字体建议FAQ本文介绍 Windows Terminal. 集成 Oh My Posh . Introduction Oh My Posh 介绍。 Introduction | Oh My PoshInstallation Windows Terminal 安装 Oh My Posh. Wind…

ESP32学习笔记:NVS分区永久保存数据

程序示例: /*ESP32 startup counter example with Preferences library.This simple example demonstrates using the Preferences library to store how many times the ESP32 module has booted. The Preferences library is a wrapper around the Non-volatile storage on …

Wireshark基础教程

Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程各种问题定位。本文主要内容包括: 1、Wireshark软件下载和安装以及Wireshark主界面介绍。 2、WireShark简单抓包示例。通过该例子学会怎么抓包以及如何简单查看分析…

SQL 数据库学习 Part 1

数据和信息 信息 信息是客观存在的,是关于现实世界事物的存在方式或运动状态 数据 数据是用来记录信息的可识别的符号,是信息的具体表现形式 数据和信息的联系数据是信息的符号表示或载体 信息则是数据的内涵,是对数据的语义解释数据库 定义 数据库是长期存储在计算机内、有…

1_JAVA线程

Java 线程 1. 创建和运行线程 1.1 直接使用 Thread 例如: public class ThreadTest {public static void main(String[] args) {Thread t = new Thread() {public void run(){// 要执行的任务System.out.println(Thread.currentThread().getName()+" Running");}};/…

Go变量作用域精讲及代码实战

关注作者,复旦AI博士,分享AI领域与云服务领域全维度开发技术。拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕博,复旦机器人智能实验室成员,国家级大学生赛事评审专家,发表多篇SCI核心期刊学术论文,阿里云认证的资深架构师,项目管理专业人士,上…

C# JavaScriptSerializer序列化时的时间处理详解

原文链接:https://www.jb51.net/article/122143.htm输出如下图所示: 猜测这里是由于js初始化时间的时候往往是向 1970/01/01 添加毫秒数,JavaScriptSerializer进行序列化的时候也会格式化为距离1970/01/01 到当该时间点GMT+0 时间的毫秒数, 如果直接反序列化可以看到少了8…

智能编程支持分析本地工程文件,项目级开发效率再度提升!

CodeGeeX的智能问答新增关联本地文件的系列功能,用户在智能问答的输入框中输入@,就可以在弹出框中选择需要使用的指令。从而能够针对所关联的文件给出更有针对性的问答和代码建议。下面我们将分别介绍在编程工作中,如何关联本地文件,并且使用不同的指令,来获得更精准的分析…

100%国产化网卡,联瑞在行动

国产CPU与国产网卡都是我国信息技术产业中的重要组成部分,它们的发展对于提升我国信息技术水平、保障信息安全和促进经济发展具有重要意义。 国产CPU在近年来取得了显著进展。例如飞腾、申威、海光、华为鲲鹏、龙芯、兆芯等品牌的CPU产品百花齐放,这些产品在性能上已经能够与…

C++面向对象语言自制多级菜单

C++面向对象语言自制多级菜单,可移植进嵌入式系统因为要做一个小应用,需要一个菜单类,在网上找了许久,也没有找到一款心仪的菜单类,索性用C++语言,自制一个命令行级别的菜单类,并制作成库,现记录下来,供以后借鉴。 一、特性无限制条目 无限制层级 用户自定义条目和动作…

Redis之主从同步

概念主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。 前者称为主节点(master/leader),后者称为从节点(slave/follower); 数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave 以读为主。 默认情况下,每台Redis服务器都是主节点;且一个主节点可…