У меня возникла проблема с обновлением модели 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
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
SwiftData: добавление UUID в существующую модель всегда создает тот же идентификатор
Anonymous » » в форуме IOS - 0 Ответы
- 7 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Чтобы сравнить UUID, могу ли я использовать == или использовать UUID.equals(UUID)?
Anonymous » » в форуме JAVA - 0 Ответы
- 56 Просмотры
-
Последнее сообщение Anonymous
-