SwiftData: добавление UUID в существующую модель всегда создает тот же идентификаторIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 SwiftData: добавление UUID в существующую модель всегда создает тот же идентификатор

Сообщение Anonymous »

У меня возникла проблема с обновлением модели SwiftData путем добавления свойства.

В частности, у меня есть следующая модель, и я пытаюсь обновить ее, добавив идентификатор. Проблема в том, что если я это сделаю, все записи, уже хранящиеся в приложении, обновятся с тем же UUID. Очевидно, я хотел бы иметь разные идентификаторы для каждого экземпляра. Я что-то упускаю? Должен ли я сделать что-то по-другому?
Воспроизводимый пример
Сначала я создаю контейнер, используя .modelContainer(for: Word.self) в WindowGroup в структуре App, как обычно. модель: V1

Код: Выделить всё

@Model
class Word {
private(set) var term: String = ""

init (term: String) {
self.term = term
}
}

Код: Выделить всё

ContentView
: V1

Код: Выделить всё

struct ContentView: View {
@Query private var words: [Word]
@Environment(\.modelContext) private var modelContext

var body: some View {
NavigationStack {
List(words) { word in
VStack(alignment: .leading) {
Text(word.term)
}
}
.navigationTitle("SwiftData")
.toolbar {
Button("Insert") {
modelContext.insert(Word(term: "Swift"))
modelContext.insert(Word(term: "Apple"))
}
}
}
}
}
После запуска этой версии и добавления нескольких экземпляров Word мы можем попробовать добавить свойство wordId. модель: V2

Код: Выделить всё

wordIdДобавлено свойство 
.

Код: Выделить всё

@Model
class Word {
var wordId: UUID = UUID()
private(set) var term: String = ""

init (wordId: UUID, term: String) {
self.wordId = wordId
self.term = term
}
}

Код: Выделить всё

ContentView
: V2
Давайте отразим изменения.

Код: Выделить всё

struct ContentView: View {
@Query private var words: [Word]
@Environment(\.modelContext) private var modelContext

var body: some View {
NavigationStack {
List(words) { word in
VStack(alignment: .leading) {
Text(word.wordId.uuidString)
Text(word.term)
}
}
.navigationTitle("SwiftData")
.toolbar {
Button("Insert") {
modelContext.insert(Word(wordId: UUID(), term: "Swift"))
modelContext.insert(Word(wordId: UUID(), term: "Apple"))
}
}
}
}
}
Ошибка, которую я получаю
При запуске обновленной версии приложения становится ясно, что каждый экземпляр Word подвергался облегченному была добавлена ​​миграция и новое свойство... но UUID одинаков для каждого Word, что делает его бесполезным.


Подробнее здесь: https://stackoverflow.com/questions/792 ... he-same-id
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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