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

SwiftData无法获取一对多反向关联问题(续)

SwiftData一对多关系子模型未保存问题解决

问题原因

你的代码仅将MyModel插入到上下文,但关联的MyModelField未被SwiftData追踪保存。虽然在MyModelField初始化时设置了model属性,但MyModel的fields数组并未包含这两个子模型,双向关系未正确建立,导致上下文无法识别需要保存这些子模型,因此不会生成MyModelField的SQL插入语句。

解决方案

只需在创建子模型后,将其添加到父模型的fields数组中,利用SwiftData双向关系的自动同步机制,上下文会自动追踪并保存子模型。

修改createMyModel方法如下:

public func createMyModel(uuid: String) throws {
    let modelContext = self.modelContext

    let myModel = MyModel(uuid: uuid)
    let field1 = MyModelField(myModel, "hello", "world")
    let field2 = MyModelField(myModel, "bonjour", "monde")
    
    // 将子模型添加到父模型的关系数组中
    myModel.fields.append(field1)
    myModel.fields.append(field2)
    
    modelContext.insert(myModel)
    
    print("field1:\(field1) - field2:\(field2)")
    
    try modelContext.save()
}

另一种可选方案

如果你不想修改父模型的数组,也可以显式将子模型插入到上下文:

public func createMyModel(uuid: String) throws {
    let modelContext = self.modelContext

    let myModel = MyModel(uuid: uuid)
    let field1 = MyModelField(myModel, "hello", "world")
    let field2 = MyModelField(myModel, "bonjour", "monde")
    
    modelContext.insert(myModel)
    // 显式插入子模型
    modelContext.insert(field1)
    modelContext.insert(field2)
    
    print("field1:\(field1) - field2:\(field2)")
    
    try modelContext.save()
}

修改后效果

执行代码后,输出会符合你的期望:

# List:
# Dump:[]
# Add:
field1:hello:world - field2:bonjour:monde
# List:
# Dump:[9C66CA5B-D91C-480F-B02C-2D14EEB49902([hello:world, bonjour:monde])]
DONE

内容的提问来源于stack exchange,提问作者OlivierM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 07:44:52