В файле xcdatamodeld я создал объект Person
с полями firstName
, lastName
и email
. Затем я создал объект User
с дополнительным полем в нем. Я установил Person
в качестве родительского объекта User
.Иерархия родительского ребенка в NSManagedObject CoreData
Затем я использовал параметр «Создать NSManagedObject Subclass ...» из меню «Редактор» и сгенерировал классы для этих объектов.
Теперь, когда я сделал User* user = [[User alloc] init]
, я не смог получить доступ к user.firstName
или другим свойствам суперкласса Person
по какой-то причине. Он сказал, «Property ПгвЬЫате не был найден на объект типа User *»
Когда я проверил, сгенерированный User
класс был подклассом NSManagedObject
и не Person
. Я думал, что это проблема, и изменил User
как подкласс Person
. Код компилируется нормально, но разбился во время выполнения с этой ошибкой -
2014-11-05 20:24:14.142 MyApp[15131:3332646] CoreData: error: Failed to call designated initializer on NSManagedObject class 'User'
2014-11-05 20:24:14.142 MyApp[15131:3332646] -[User setFirstName:]: unrecognized selector sent to instance 0x7fee5a436b90
Я не знаю, что я делаю неправильно здесь. Я думал, что Xcode должен правильно генерировать классы, и я должен быть в состоянии использовать их из коробки.
Я, [и другие] (http://stackoverflow.com/questions/25703485/coredata-abstract-entity-with-relationship/) нашел, что так легко не иметь родительского объекта в графическом интерфейсе XCode. Просто установить родительский объект как Person должно быть достаточно для доступа к user.firstName. Вы также можете запросить user.entity.superEntity.name или какой-либо другой такой путь для проверки наследования. – stevesliva