2011-12-30 64 views
2

我为我的CoreData堆栈使用自定义类。类属性在模型中正确设置。在应用程序中有一些抽象使用setValue ...在NSManagedObject上,但我有一些情况下,NSInvalidArgumentException失败,特别是在设置相关对象时;错误表示它想要特定的类型,并且它'获取NSManagedObject,因此是错误。所以,我认为如果它是某个实体的话,我会采取短路线并在违规呼叫之前投我的实例;像这样:将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继承),那么这是没有必要的,这是另一个令人困惑的事情,但首先要做的事情。我如何强制对象键入联系人,它确实是?

下面是相关的痕迹:

*终止应用程序由于未捕获的异常“NSInvalidArgumentException”,理由是:“为一对一的关系不可接受类型的值:属性=‘联系’;所需类型=联系人;给定类型= NSManagedObject;值= ...

为了完整起见,地址类有声明联系人为:

@property (nonatomic, retain) NSManagedObject * Contact; 

与实施联系为正常的动态,如:

@dynamic Contact; 

也许我需要有些睡眠? ;-)谢谢

回答

2

演员阵容不是你的问题。铸造不会改变对象的类别 - 编译器认为它是

您的对象是NSManagedObject,但不是Contact实例。在你编码object你有一个Hospital实体。仔细检查Hospital实体是否设置为使用Contact类(或子类))。

重要的是要注意实体继承和Objective-C类继承不必匹配。即您可以将Hospital作为Contact的子条目,并且仍然将Contact实体映射到Contact类,而不将Hospital映射到Contact类的子类。它是有效的Hospital实体映射到(相同)Contact类,甚至到NSManagedObject(这是我怀疑你已经完成)。

这看起来可能会让人困惑,但如果使用正确,可能会非常强大。

+0

谢谢丹尼尔。医院扩展了Contact类和实体。所以,如果我无法摆脱这一点,我怎么能得到地址使用NSManagedObject设置它的Contact属性时不抛出InvalidArgExc?我只是假设将管理对象转换为正确的类型可以解决问题,并且是最快的解决方案。再次感谢 – wkhatch 2011-12-30 14:59:56

+0

啊哈!自定义子类没有被添加到目标中......补充它;我不能相信我错过了这一点。我应该知道,因为每当我看到NSManagedObject的子类始终作为NSManagedObject返回的类似问题时,它可能是您没有在模型中设置类属性,或者...您的类不在目标。当这一切;-)感谢丹尼尔 – wkhatch 2011-12-30 15:51:27

1

所以是的,事实证明我确实需要一些睡眠;-)问题是没有包含在目标中的子类。我知道我有类似的问题,当你有一个子类,它在目标中,但你忘了在模型中定义自定义子类。

+0

谢谢你回来,并填写答案,因为它只是让我出了一个洞!我发现有时当我(很糟糕)解决了我的项目文件中的合并冲突时,某些类的编译指令不见了。有一个难以理解的原因,我一直无法弄清楚,尽管这发生在我的NSManagedObject子类IT仍然编译。补充它。 – Damo 2012-01-17 15:13:51