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
相关产品推荐
相关产品推荐

