Core data 将NSManagedObject转换为子类类型时出现问题

Core data 将NSManagedObject转换为子类类型时出现问题,core-data,casting,relationship,nsmanagedobject,Core Data,Casting,Relationship,Nsmanagedobject,我正在为CoreData堆栈使用自定义类。在模型中正确设置了类属性。应用程序中的某些点被抽象为使用setValue。。。在NSManagedObject上,但我有一些情况下,NSInvalidArgumentException失败,特别是在设置相关对象时;错误表示它需要特定类型,并且它正在获取NSManagedObject,因此出现错误。所以,我想我应该走一条很短的路,在这个冒犯性的电话之前,如果它是某个实体的话,我会给出我的例子;像这样: NSManagedObject *addressObj

我正在为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”而终止应用程序,原因:“to-one关系的值类型不可接受:property=“Contact”;所需类型=触点;给定类型=NSManagedObject;值=

为完整起见,Address类的联系人声明如下:

@property (nonatomic, retain) NSManagedObject * Contact;
将Contact的实现作为正常动态,如:

@dynamic Contact;

也许我需要睡一觉?;-)谢谢

演员阵容不是你的问题。强制转换不会改变对象是什么类-只是改变编译器认为它是什么

您的对象是NSManagedObject,但不是
Contact
实例。在您的代码中,您拥有的
对象是一个
医院
实体。再次检查
医院
实体是否设置为使用
联系人
类(或子类))

需要注意的是,实体继承和Objective-C类继承不必匹配。也就是说,您可以将
医院
作为
联系人
的子条目,并且仍然将
联系人
实体映射到
联系人
类,而不将
医院
映射到
联系人
类的子类。
医院
实体映射到(相同的)
联系人
类,甚至映射到
NSManagedObject
(我怀疑您是这样做的)是有效的


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

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

谢谢你,丹尼尔。医院扩展了联系人类别和实体。所以,如果我无法将我的地址从中排除,那么在使用NSManagedObject设置它的联系人属性时,如何获得地址以不抛出InvalidArgExc?我只是假设将托管对象强制转换为正确的类型可以解决这个问题,这是最快的解决方案。再次感谢你!!自定义子类未添加到目标。。。该死的;真不敢相信我错过了。我应该知道,因为每当我看到类似的问题,NSManagedObject的子类总是作为NSManagedObject返回时,要么你没有在模型中设置class属性,要么。。。你的班级不在目标范围内。该死的;-)感谢DanielThanks返回并填写答案,因为它刚刚让我走出困境!我发现,有时当我(糟糕地)解决了项目文件中的合并冲突时,某些类的compile指令就会丢失。出于一个模糊的原因,我一直无法弄清楚,尽管这发生在我的NSManagedObject子类上,但它仍在编译中。该死的。