Unten finden Sie eine kleine Demo zur Veranschaulichung dieses Szenarios. In der Demo deklarieren wir zwei Modelle, ModelA und ModelB, mit einer Beziehung zwischen ihnen und zeigen alle Instanzen der Modelle in einer Liste an. Durch Klicken auf „Zuerst ausführen“ werden einige Instanzen von ModelA in den Container eingefügt und wie erwartet in der Liste angezeigt.
Durch Klicken auf „Run Second“ erstellt eine Instanz von ModelB und weist einer Instanz von ModelA eine Beziehung zu. Auch wenn modelContext.insert(modelB) nie aufgerufen wird, wird die Instanz von ModelB trotzdem zum Container hinzugefügt.
Ist das ein Fehler in SwiftData, oder? Ist es das erwartete Verhalten? Ich konnte in der SwiftData-Dokumentation keinen Hinweis darauf finden.
Code: Select all
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)
}