Недавно мы решили добавить несколько необязательных атрибутов двойного типа (с именами last7
, last30
и last60
) к нашей сущности Product
CoreData, но это вызывает NSInternalInconsistencyException
:
*** Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Свойство с именем« sortKey »в сущности« Комментарий »конфликтует со свойством, унаследованным от родительской сущности« ChatItem »'
Comment
является подклассом ChatItem
, а sortKey
является атрибутом String, объявленным в ChatItem
, унаследованным Comment
. Comment
имеет индекс выборки для свойства sortKey
; удаление этого не решает проблему.
Как вы можете видеть на скриншоте этого соединителя, Product
s тангенциально связаны с этими двумя классами. через сущность Event
; каждый Product
имеет число Event
с, а каждый Event
имеет число ChatItem
с. На практике большинство из этих ChatItem
относятся к подклассу Comment
.
Пометка новых свойств как "переходные" решает проблему сбоя , но не сохраняет данные в CoreData, что является обязательным требованием для этих значений.
Мы заметили, что эта проблема не возникает при чистой установке, поэтому мы предполагаем, что она каким-то образом связана с миграциями. Основываясь на принятом ответе на этот очень похожий вопрос StackOverflow ( Предотвращение CoreData cra sh для обновления пользователей ), мы убедились, что мы включили облегченные миграции:
let options = [
NSMigratePersistentStoresAutomaticallyOption: true,
NSInferMappingModelAutomaticallyOption: true,
NSSQLiteAnalyzeOption: true,
NSSQLiteManualVacuumOption: true
]
store.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: self.storeURL, options: options)
Мы путать, потому что собственность, которая якобы вызывает проблему, не является частью объекта, который мы меняем; что нам не хватает?