【发布时间】:2011-12-30 03:59:43
【问题描述】:
我正在为我的 CoreData 堆栈使用自定义类。类属性在模型中正确设置。应用程序中有一些点被抽象为在 NSManagedObject 上使用 setValue...,但我有一些情况下失败并出现 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(抱歉,Hospital 继承自 Contact 这里),这将是不必要的,这是另一件令人费解的事情,但首先要做的是。如何强制对象键入 Contact,它确实是?
这是相关的跟踪:
* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“一对一关系的值类型不可接受:property = “Contact”;所需类型 = 联系方式;给定类型 = NSManagedObject;价值 = ...
为了完整起见,Address 类将 Contact 声明为:
@property (nonatomic, retain) NSManagedObject * Contact;
将 Contact 的实现作为正常动态,例如:
@dynamic Contact;
也许我需要睡觉? ;-) 谢谢
【问题讨论】:
标签: core-data casting relationship nsmanagedobject