Я создаю небольшое приложение с использованием 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
Модель SwiftData вставляется в контекст при назначении связи. ⇐ IOS
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Mypy говорит «несовместимые типы в назначении» при назначении из множественного наследства
Anonymous » » в форуме Python - 0 Ответы
- 14 Просмотры
-
Последнее сообщение Anonymous
-
-
-
«Несовместимые типы в назначении» при назначении из множественного наследства в Mypy
Anonymous » » в форуме Python - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-
-
-
SwiftData Custom Migration всегда терпит неудачу - возможна ошибка в SwiftData
Anonymous » » в форуме IOS - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-