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