You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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关联:

  1. 安装sqlite-net-extensions NuGet包
  2. 修改实体类:
[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; }
}
  1. 创建表并插入数据:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:06:18