如何在SQLite中保存含自定义类对象参数的CompletedChecklist表
解决SQLite中包含复杂对象的实体保存问题
问题原因
SQLite本身不支持直接存储自定义复杂对象作为表列,你的CompletedChecklist类中包含CompletedChecklistData对象属性,默认的SQLite数据映射库(如sqlite-net)无法识别该类型,导致表创建失败,进而出现no such table: CompletedChecklist错误。
解决方案
方案1:将复杂对象序列化为JSON字符串存储
把CompletedChecklistData序列化为JSON字符串,以普通字符串类型存储到SQLite中,业务逻辑层通过属性包装实现对象与JSON的转换:
[Table(nameof(CompletedChecklist))] public class CompletedChecklist : BaseDatabaseModel { public string MachineId { get; set; } public string WorkerId { get; set; } public DateTime CompletedAt { get; set; } // 实际存储到SQLite的JSON字符串 public string CompletedChecklistDataJson { get; set; } // 业务逻辑用的对象属性,标记为[Ignore]不参与数据库持久化 [Ignore] public CompletedChecklistData CompletedChecklistData { get => string.IsNullOrEmpty(CompletedChecklistDataJson) ? null : System.Text.Json.JsonSerializer.Deserialize<CompletedChecklistData>(CompletedChecklistDataJson); set => CompletedChecklistDataJson = System.Text.Json.JsonSerializer.Serialize(value); } } public class CompletedChecklistData { public string Id { get; set; } public List<ChecklistItem> ChecklistItems { get; set; } }
方案2:使用一对一关联表(基于sqlite-net-extensions)
通过sqlite-net-extensions库实现实体间的一对一关系,将CompletedChecklistData作为独立表存储,与CompletedChecklist关联:
- 安装
sqlite-net-extensionsNuGet包 - 修改实体类:
[Table(nameof(CompletedChecklist))] public class CompletedChecklist : BaseDatabaseModel { public string MachineId { get; set; } public string WorkerId { get; set; } public DateTime CompletedAt { get; set; } // 一对一关联,设置级联操作自动处理子实体的增删改 [OneToOne(CascadeOperations = CascadeOperation.All)] public CompletedChecklistData CompletedChecklistData { get; set; } } [Table(nameof(CompletedChecklistData))] public class CompletedChecklistData { [PrimaryKey] public string Id { get; set; } public List<ChecklistItem> ChecklistItems { get; set; } }
- 创建表并插入数据:
using var db = new SQLiteConnection("你的数据库路径"); // 必须创建所有关联的表 db.CreateTable<CompletedChecklist>(); db.CreateTable<CompletedChecklistData>(); db.CreateTable<ChecklistItem>(); // 如果ChecklistItem也是持久化实体 // 插入数据时使用InsertWithChildren方法 var newChecklist = new CompletedChecklist { Id = Guid.NewGuid().ToString(), MachineId = "M001", WorkerId = "W001", CompletedAt = DateTime.Now, CompletedChecklistData = new CompletedChecklistData { Id = Guid.NewGuid().ToString(), ChecklistItems = new List<ChecklistItem>() } }; db.InsertWithChildren(newChecklist, true);
注意事项
- 若之前已尝试创建过表,需删除旧的数据库文件(因为表创建失败后,数据库中不存在该表),或者手动执行表结构迁移。
- 如果使用方案2,确保
ChecklistItem也正确配置为可持久化实体(如果需要存储的话)。
内容的提问来源于stack exchange,提问作者sina .s
相关产品推荐
相关产品推荐

