Я создаю небольшое приложение с использованием SwiftUI и SwiftData и столкнулся со странной проблемой. Если между двумя моделями существует связь и одна из моделей уже существует в контейнере, создание связанной модели автоматически добавляет ее в контейнер без явного вызова modelContext.insert(model).
Ниже приведена небольшая демонстрация, иллюстрирующая этот сценарий. В демонстрации мы объявляем две модели, ModelA и ModelB, со связью между ними и отображаем все экземпляры моделей в списке. При нажатии Выполнить первым некоторые экземпляры ModelA вставляются в контейнер, и, как и ожидалось, они появляются в списке.
Нажатие «Выполнить второй» создает экземпляр ModelB и назначает связь с экземпляром ModelA. Несмотря на то, что modelContext.insert(modelB) никогда не вызывается, экземпляр ModelB все равно добавляется в контейнер.
Это ошибка в SwiftData или это ожидаемое поведение? Я не смог найти упоминания об этом в документации SwiftData.
import SwiftUI
import SwiftData
@Model class ModelA {
var name: String
@Relationship(deleteRule: .cascade, inverse: \ModelB.modelA) var modelB: [ModelB]? = []
init(name: String) {
self.name = name
}
}
@Model class ModelB {
var name: String
var modelA: ModelA?
init(name: String, modelA: ModelA? = nil) {
self.name = name
}
}
struct Demo: View {
@Environment(\.modelContext) var modelContext
@Query var modelAs: [ModelA]
@Query var modelBs: [ModelB]
var body: some View {
List {
Button("Run First") {
modelContext.insert(ModelA(name: "ModelA 1"))
modelContext.insert(ModelA(name: "ModelA 2"))
modelContext.insert(ModelA(name: "ModelA 3"))
modelContext.insert(ModelA(name: "ModelA 4"))
}
Button("Run Second") {
if let modelA = modelAs.first {
let modelB = ModelB(name: "Shouldn't be saved")
modelB.modelA = modelA
}
}
Section {
ForEach(modelAs) { modelA in
Text(modelA.name)
}
}
Section {
ForEach(modelBs) { modelB in
Text(modelB.name)
}
}
}
}
}
#Preview {
let configuration = ModelConfiguration(isStoredInMemoryOnly: true, cloudKitDatabase: .none)
let container = try! ModelContainer(for: ModelA.self, configurations: configuration)
Demo()
.modelContainer(container)
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... s-assigned