在當今快速發展的軟件開發領域,開發者常常需要一個輕量、高效、易用的數據存儲解決方案。LiteDB 應運而生,為 .NET 開發者提供了一個簡單而強大的嵌入式 NoSQL 數據庫選擇。
本教程將帶你全面深入地探索 LiteDB 的使用,從基礎的數據庫連接和實體模型設計,到復雜的文檔增刪改查操作,再到事務處理、性能優化和異常處理,通過系統性的學習,你將全面掌握 LiteDB 在實際項目中的應用技巧和最佳實踐。
1. 準備工作 首先,確保通過 NuGet 安裝 LiteDB 包:
Install-Package LiteDB
2. 定義實體模型 // 用戶實體類 public class User { // LiteDB 要求每個文檔都有一個 Id 屬性 public int Id { get; set ; } // 用戶基本信息 public string Username { get; set ; } public string Email { get; set ; } public int Age { get; set ; } // 用戶角色信息 public string [] Roles { get; set ; } // 用戶詳細信息 public UserProfile Profile { get; set ; } }
// 用戶詳細信息類 public class UserProfile { public string Address { get; set ; } public string PhoneNumber { get; set ; } }
3. 數據庫連接與基本操作 3.1 創建數據庫連接 using LiteDB;public class UserRepository { // 數據庫連接字符串 private const string DATABASE_PATH = @"MyDatabase.db" ; // 創建數據庫連接 private LiteDatabase CreateDatabaseConnection () { // 創建 LiteDB 數據庫實例 return new LiteDatabase(DATABASE_PATH); } }
3.2 插入文檔 public void InsertUser (User user) { // 使用 using 確保資源正確釋放 using (var db = CreateDatabaseConnection()) { // 獲取 Users 集合 var users = db.GetCollection<User>("users" ); // 插入單個文檔 users.Insert(user); // 插入多個文檔 var multiUsers = new List<User> { new User { Username = "張三" , Email = "zhangsan@example.com" , Age = 25 }, new User { Username = "李四" , Email = "lisi@example.com" , Age = 30 } }; users.InsertBulk(multiUsers); } }
調用 internal class Program { static void Main (string [] args) { UserRepository userRepository = new UserRepository(); userRepository.InsertUser(new User { Id = 1 , Username = "John" , Age = 25 , Email = "john@example.com" , Roles = new string [] { "admin" , "user" }, Profile = new UserProfile { Address = "123 Main St" , PhoneNumber = "555-555-5555" } }); } }
3.3 查詢文檔 // 根據 Id 查詢單個用戶 public User GetUserById (int userId) { using (var db = CreateDatabaseConnection()) { var users = db.GetCollection<User>("users" ); return users.FindById(userId); } }// 復雜條件查詢 public List<User> QueryUsers(int minAge, string role) { using (var db = CreateDatabaseConnection()) { var users = db.GetCollection<User>("users" ); // 使用 LiteDB 支持的查詢方式 return users.Query() .Where(u => u.Age >= minAge && u.Roles != null && u.Roles.Contains(role) ) .OrderBy(u => u.Username) .Limit(100 ) .ToList(); } }// 模糊查詢 public List<User> SearchUsersByName(string keyword) { using (var db = CreateDatabaseConnection()) { var users = db.GetCollection<User>("users" ); return users.Query() .Where(u => u.Username.Contains(keyword)) .ToList(); } }
調用 internal class Program { static void Main (string [] args) { UserRepository userRepository = new UserRepository(); var user = userRepository.GetUserById(1 ); //Console輸入出user的信息 Console.WriteLine(user.Username); Console.WriteLine(user.Age); Console.WriteLine(user.Email); foreach (var role in user.Roles) { Console.WriteLine(role); } Console.WriteLine(user.Profile.Address); Console.WriteLine(user.Profile.PhoneNumber); } }
注意:在Roles為空時的判斷
3.4 更新文檔 實例更新 public bool UpdateUser (User user) { using (var db = CreateDatabaseConnection()) { var users = db.GetCollection<User>("users" ); // 根據 Id 更新整個文檔 var result = users.Update(user); return result; } }
3.5 刪除文檔 public class UserRepository { // 按 Id 刪除 public void DeleteUserById (int userId) { using (var db = CreateDatabaseConnection()) { var users = db.GetCollection<User>("users" ); users.Delete(userId); } } // 按條件刪除 public void DeleteUsersByCondition () { using (var db = CreateDatabaseConnection()) { var users = db.GetCollection<User>("users" ); // 刪除 30 歲以下的用戶 users.DeleteMany(u => u.Age < 30 ); } } }
4. 高級特性 4.1 事務支持 public void PerformTransactionalOperation () { using (var db = CreateDatabaseConnection()) { var transaction = db.BeginTrans(); { try { var users = db.GetCollection<User>("users" ); // 執行多個操作 users.Insert(new User { Username = "新用戶" }); users.Delete(100 ); // 刪除特定用戶 // 如果沒有異常,提交事務 db.Commit(); } catch (Exception ex) { // 發生異常時自動回滾 db.Rollback(); throw ; } } } }
4.2 索引管理 public void ManageIndexes () { using (var db = CreateDatabaseConnection()) { var users = db.GetCollection<User>("users" ); // 為 Username 創建唯一索引 users.EnsureIndex(u => u.Username, unique: true ); // 為 Email 創建文本索引 users.EnsureIndex(u => u.Email); } }
5. 注意事項 LiteDB 是嵌入式數據庫,適合小型應用
每個文檔必須有唯一 Id
支持索引以提高查詢性能
線程安全,但大量并發需謹慎
對常用查詢字段創建索引
6. 異常處理 文件和數據庫相關錯誤:
FILE_NOT_FOUND = 101 , // 文件未找到 DATABASE_SHUTDOWN = 102 , // 數據庫已關閉 INVALID_DATABASE = 103 , // 無效的數據庫 FILE_SIZE_EXCEEDED = 105 , // 文件大小超限 ALREADY_OPEN_DATAFILE = 124 , // 數據文件已打開 INVALID_DATAFILE_STATE = 999 , // 數據文件狀態無效
集合和索引相關錯誤:
COLLECTION_LIMIT_EXCEEDED = 106 , // 集合數量超限 INDEX_DROP_ID = 108 , // 不能刪除ID索引 INDEX_DUPLICATE_KEY = 110 , // 索引鍵重復 INVALID_INDEX_KEY = 111 , // 無效的索引鍵 INDEX_NOT_FOUND = 112 , // 索引未找到 INDEX_NAME_LIMIT_EXCEEDED = 128 , // 索引名稱長度超限 INVALID_INDEX_NAME = 129 , // 無效的索引名稱 COLLECTION_NOT_FOUND = 133 , // 集合未找到 COLLECTION_ALREADY_EXIST = 134 , // 集合已存在 INDEX_ALREADY_EXIST = 135 , // 索引已存在
命名和操作相關錯誤:
INVALID_COLLECTION_NAME = 130 , // 無效的集合名稱 ALREADY_EXISTS_COLLECTION_NAME = 122 ,// 集合名稱已存在 INVALID_COMMAND = 121 , // 無效的命令 INVALID_UPDATE_FIELD = 136 , // 無效的更新字段
事務和引擎相關錯誤:
INVALID_TRANSACTION_STATE = 126 , // 事務狀態無效 TEMP_ENGINE_ALREADY_DEFINED = 131 , // 臨時引擎已定義 ENGINE_DISPOSED = 137 , // 引擎已釋放 LOCK_TIMEOUT = 120 , // 鎖定超時
數據和類型相關錯誤:
INVALID_FORMAT = 200 , // 無效的格式 DOCUMENT_MAX_DEPTH = 201 , // 文檔最大深度超限 INVALID_CTOR = 202 , // 無效的構造函數 UNEXPECTED_TOKEN = 203 , // 意外的標記 INVALID_DATA_TYPE = 204 , // 無效的數據類型 PROPERTY_NOT_MAPPED = 206 , // 屬性未映射 INVALID_TYPED_NAME = 207 , // 無效的類型名稱 PROPERTY_READ_WRITE = 209 , // 屬性讀寫錯誤 DATA_TYPE_NOT_ASSIGNABLE = 214 , // 數據類型不可分配
加密和安全相關錯誤:
INITIALSIZE_CRYPTO_NOT_SUPPORTED = 210 , // 初始大小加密不支持 INVALID_INITIALSIZE = 211 , // 無效的初始大小 INVALID_NULL_CHAR_STRING = 212 , // 無效的空字符串 NOT_ENCRYPTED = 216 , // 未加密 INVALID_PASSWORD = 217 , // 無效的密碼 ILLEGAL_DESERIALIZATION_TYPE = 218 , // 非法反序列化類型
其他特殊錯誤:
INVALID_EXPRESSION_TYPE = 132 , // 無效的表達式類型 INVALID_FREE_SPACE_PAGE = 213 , // 無效的空閑空間頁 AVOID_USE_OF_PROCESS = 215 , // 避免使用進程
使用示例:
try { // 數據庫操作 }catch (LiteException ex) { switch (ex.ErrorCode) { case LiteErrorCode.COLLECTION_NOT_FOUND: Console.WriteLine("集合未找到,請檢查集合名稱" ); break ; case LiteErrorCode.INDEX_DUPLICATE_KEY: Console.WriteLine("索引鍵重復,無法插入" ); break ; // 其他錯誤處理 } }
結語 LiteDB 是一個輕量、簡單、功能強大的嵌入式 NoSQL 數據庫,非常適合中小型 .NET 應用。它提供了直觀的 API,支持復雜查詢,并且易于使用和集成。無論是桌面應用、移動應用還是小型 Web 服務,LiteDB 都是一個值得考慮的數據存儲解決方案。
該文章在 2025/1/10 14:33:33 編輯過