Я создаю небольшое приложение с использованием 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
Программируем под IOS
-
Anonymous
1735966840
Anonymous
Я создаю небольшое приложение с использованием SwiftUI и SwiftData и столкнулся со странной проблемой. Если между двумя моделями существует связь и одна из моделей уже существует в контейнере, создание связанной модели автоматически добавляет ее в контейнер без явного вызова modelContext.insert(model).
Ниже приведена небольшая демонстрация, иллюстрирующая этот сценарий. В демонстрации мы объявляем две модели, ModelA и ModelB, со связью между ними и отображаем все экземпляры моделей в списке. При нажатии [b]Выполнить первым[/b] некоторые экземпляры ModelA вставляются в контейнер, и, как и ожидалось, они появляются в списке.
Нажатие [b] «Выполнить второй»[/b] создает экземпляр 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)
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79328276/swiftdata-model-is-inserted-into-context-when-relationship-is-assigned[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия