2014-11-06 2 views
0

В файле 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 должен правильно генерировать классы, и я должен быть в состоянии использовать их из коробки.

+0

Я, [и другие] (http://stackoverflow.com/questions/25703485/coredata-abstract-entity-with-relationship/) нашел, что так легко не иметь родительского объекта в графическом интерфейсе XCode. Просто установить родительский объект как Person должно быть достаточно для доступа к user.firstName. Вы также можете запросить user.entity.superEntity.name или какой-либо другой такой путь для проверки наследования. – stevesliva

ответ

2

Я подозреваю, что неудачная инициализация (первая ошибка в списке) является причиной второй ошибки (непризнанный селектор).

Вам необходимо использовать initWithEntity:insertIntoManagedObjectContext:, а не только init. Или, альтернативно, используйте метод NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:.

+0

Да. Я понял, что через пару часов. Это была проблема. –