Модель SwiftData вставляется в контекст при назначении связи.IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Модель SwiftData вставляется в контекст при назначении связи.

Сообщение Anonymous »

Я создаю небольшое приложение с использованием 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»