Как создать объект предыдущей версии NSManagedObjectModel без вызова текущей версии awakeFromInsert?
У меня есть модель данных Core Data с несколькими версиями модели (чтобы разрешить миграцию). Мои сущности имеютcodegen
настройка установлена наManual / none
, и у меня есть соответствующие классы в моей кодовой базе, где я подключаюсь к определенным методам, таким какvalidateForUpdate
, , и т. д:
@objc(Book)
class Book: NSManagedObject {
@NSManaged var title: String
override func validateForUpdate() throws {
try super.validateForUpdate()
try customValidation()
}
}
Во время миграции старого хранилища мне необходимо загрузить старое хранилище, используя версию старой модели, и выполнить некоторые обновления управляемых объектов. Однако подтверждение со стороныNSManagedObject
class все еще работает, хотя он был разработан только для работы с последней версией. Это может относиться к атрибутам, которых нет в старой версии, что дает мнеunrecognized selector
ошибки.
Пример кода, который я использую для загрузки магазина со старой моделью:
// book_5 is the name of the older model version
let model = NSManagedObjectModel(contentsOf: Bundle.main.url(forResource: "books_5", withExtension: "momd")!)!
let container = NSPersistentContainer(name: "TestModel", managedObjectModel: model)
let description = NSPersistentStoreDescription(url: storeLocation)
container.persistentStoreDescriptions = [description]
container.loadPersistentStores { _, _ in
let entity = model.entitiesByName["Book"]!
let newBook = NSManagedObject(entity: entity, insertInto: container.viewContext)
newBook.setValue("Test Book", forKey: "title")
try! container.viewContext.save()
}
При вставке объекта в контекстawakeFromInsert
метод запускается, вызывая ошибку, поскольку он ссылается на атрибуты, которые существуют только в самой новой версии модели.
Есть ли способ обойти это? Я чувствую, что это должно быть возможно, потому что манипулирование исходными объектами сущностей в пользовательском сопоставлении сущностей во время тяжеловесной миграции не приводит к той же проблеме.