У меня возникла проблема с обновлением модели SwiftData путем добавления свойства.
В частности, у меня есть следующая модель, и я пытаюсь обновить ее, добавив идентификатор. Проблема в том, что если я это сделаю, все записи, уже хранящиеся в приложении, обновятся с тем же UUID. Очевидно, я хотел бы иметь разные идентификаторы для каждого экземпляра. Я что-то упускаю? Стоит ли мне сделать что-то по-другому?
Word model
В предыдущей версии модель не имела свойства id, соответствующего ключа кодирования и атрибута в инициализаторе.
@Model
class Word: Codable {
enum CodingKeys: CodingKey {
case id, term, learntOn, notes, category, bookmarked
}
var id: UUID = UUID() // marked it as var for testing
let term: String = ""
let learntOn: Date = Date.now
var notes: String = ""
@Relationship(inverse: \Category.words) var category: Category?
var bookmarked: Bool = false
init(id: UUID, term: String, learntOn: Date, notes: String = "", category: Category? = nil, bookmarked: Bool = false) {
self.id = id
self.term = term
self.learntOn = learntOn
self.notes = notes
self.category = category
self.bookmarked = bookmarked
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.id = try container.decode(UUID.self, forKey: .id)
self.term = try container.decode(String.self, forKey: .term)
let learntOn = try container.decode(String.self, forKey: .learntOn)
self.learntOn = try Date(learntOn, strategy: .iso8601)
self.notes = try container.decode(String.self, forKey: .notes)
self.category = try container.decode(Category?.self, forKey: .category)
self.bookmarked = try container.decode(Bool.self, forKey: .bookmarked)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.id, forKey: .id)
try container.encode(self.term, forKey: .term)
try container.encode(self.learntOn, forKey: .learntOn)
try container.encode(self.notes, forKey: .notes)
try container.encode(self.category, forKey: .category)
try container.encode(self.bookmarked, forKey: .bookmarked)
}
static func decodeWords(from json: String) throws -> [Word] {
let data = json.data(using: .utf8)!
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
return try decoder.decode([Word].self, from: data)
}
static let example = Word(id: UUID(), term: "Swift", learntOn: .now, notes: "A swift testing word.", bookmarked: true)
Подробнее здесь: https://stackoverflow.com/questions/792 ... he-same-id
SwiftData: добавление UUID в существующую модель всегда создает тот же идентификатор ⇐ IOS
Программируем под IOS
1733605631
Anonymous
У меня возникла проблема с обновлением модели SwiftData путем добавления свойства.
В частности, у меня есть следующая модель, и я пытаюсь обновить ее, добавив идентификатор. Проблема в том, что если я это сделаю, все записи, уже хранящиеся в приложении, обновятся с тем же UUID. Очевидно, я хотел бы иметь разные идентификаторы для каждого экземпляра. Я что-то упускаю? Стоит ли мне сделать что-то по-другому?
Word model
В предыдущей версии модель не имела свойства id, соответствующего ключа кодирования и атрибута в инициализаторе.
@Model
class Word: Codable {
enum CodingKeys: CodingKey {
case id, term, learntOn, notes, category, bookmarked
}
var id: UUID = UUID() // marked it as var for testing
let term: String = ""
let learntOn: Date = Date.now
var notes: String = ""
@Relationship(inverse: \Category.words) var category: Category?
var bookmarked: Bool = false
init(id: UUID, term: String, learntOn: Date, notes: String = "", category: Category? = nil, bookmarked: Bool = false) {
self.id = id
self.term = term
self.learntOn = learntOn
self.notes = notes
self.category = category
self.bookmarked = bookmarked
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.id = try container.decode(UUID.self, forKey: .id)
self.term = try container.decode(String.self, forKey: .term)
let learntOn = try container.decode(String.self, forKey: .learntOn)
self.learntOn = try Date(learntOn, strategy: .iso8601)
self.notes = try container.decode(String.self, forKey: .notes)
self.category = try container.decode(Category?.self, forKey: .category)
self.bookmarked = try container.decode(Bool.self, forKey: .bookmarked)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.id, forKey: .id)
try container.encode(self.term, forKey: .term)
try container.encode(self.learntOn, forKey: .learntOn)
try container.encode(self.notes, forKey: .notes)
try container.encode(self.category, forKey: .category)
try container.encode(self.bookmarked, forKey: .bookmarked)
}
static func decodeWords(from json: String) throws -> [Word] {
let data = json.data(using: .utf8)!
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
return try decoder.decode([Word].self, from: data)
}
static let example = Word(id: UUID(), term: "Swift", learntOn: .now, notes: "A swift testing word.", bookmarked: true)
Подробнее здесь: [url]https://stackoverflow.com/questions/79261406/swiftdata-adding-a-uuid-to-an-existing-model-always-creates-the-same-id[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия