Проблемы приведения NSManagedObject к типу подкласса - PullRequest
2 голосов
/ 30 декабря 2011

Я использую пользовательские классы для своего стека CoreData.Свойства класса правильно установлены в модели.В приложении есть некоторые моменты, которые абстрагированы от использования setValue ... в NSManagedObject, но у меня есть несколько случаев, когда происходит сбой с NSInvalidArgumentException, особенно при установке связанного объекта;Ошибка указывает на то, что ему нужен определенный тип, и он получает NSManagedObject, отсюда и ошибка.Итак, я подумал, что просто выберу короткий маршрут и произнесу свой экземпляр перед вызовом-нарушителем, если он имеет определенную сущность;как это:

NSManagedObject *addressObject = [NSEntityDescription insertNewObjectForEntityForName:@"Address" inManagedObjectContext:[object managedObjectContext]];
    if ([[[object entity]name] isEqualToString:@"Hospital"]) {
        Contact *contact = (Contact*)object;
        DLog(@"The class of contact is: %@", [contact class]);
        contact.Address = addressObject;

    }
    else{
        [object setValue:addressObject forKey:@"Address"];
    }

Я знаю, адрес не должен быть заглавным;Я унаследовал этот беспорядок ... во всяком случае, я бы полностью ожидал, что объект контакта является контактом, но это не так, это NSManagedObject!Что я делаю не так с актерами?Все, что я обнаружил, говорит, что это правильный способ разыграть, но по какой-то причине, это не работает для меня здесь.Конечно, в этом не было бы необходимости, если addressObject не жаловался на получение NSManagedObject вместо Contact (извините, Больница наследует от Contact здесь), и это еще одна озадачивающая вещь, но обо всем по порядку.Как я могу принудить объект к типу Contact, какой он на самом деле?

Вот соответствующая трассировка:

* Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина:'Недопустимый тип значения для отношения "один к одному": property = "Contact";желаемый тип = контакт;данный тип = NSManagedObject;value = ...

Для полноты картины класс Address имеет объявление для Contact в виде:

@property (nonatomic, retain) NSManagedObject * Contact;

с реализацией для Contact в виде обычной динамики, например:

@dynamic Contact;

Может быть, мне нужно немного поспать?;-) Спасибо

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Состав не твоя проблема.Приведение не меняет, к какому классу относится объект - только то, что компилятор считает таким.

Ваш объект является NSManagedObject, но не экземпляром Contact.В вашем коде object у вас есть Hospital сущность.Дважды проверьте, что объект Hospital настроен на использование класса Contact (или подкласса)).

Важно отметить, что наследование сущностей и наследование классов Objective-C не должныматч.Т.е. вы можете иметь Hospital, чтобы быть подстатьей Contact, и при этом иметь Contact сопоставление сущности с классом Contact без Hospital сопоставления с подклассом класса Contact.Для сущности Hospital допустимо сопоставление с (тем же) классом Contact или даже с NSManagedObject (что, как я подозреваю, вы сделали).

Это может показаться странным, но можетбыть очень сильным, если используется правильно.

1 голос
/ 30 декабря 2011

Так что да, оказывается, мне нужно немного поспать ;-) Проблема заключалась в том, что подкласс не был включен в цель.Я знаю, что у меня возникали похожие проблемы, когда у вас есть подкласс, и он находится в целевом объекте, но вы также забыли определить собственный подкласс в модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...