我正在为我的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而不是联系人(抱歉,医院继承自联系人),这就没有必要了,这是另一个令人困惑的事情,但首先要做的事情。我怎样才能强迫对象输入联系人呢?
以下是相关的痕迹:
* 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'对于一对一关系的值不可接受的类型:property =“Contact”;期望的类型=联系;给定type = NSManagedObject; value = ...
为了完整起见,Address类具有Contact的声明:
@property (nonatomic, retain) NSManagedObject * Contact;
将Contact的实现作为普通动态,例如:
@dynamic Contact;
也许我需要睡一觉? ;-)谢谢
答案 0 :(得分:2)
演员不是你的问题。转换不会改变对象的类 - 只是编译器认为的内容。
您的对象是NSManagedObject,但不是Contact
实例。在您的代码中,您拥有的object
是Hospital
实体。仔细检查Hospital
实体是否设置为使用Contact
类(或子类)。
重要的是要注意,Entity继承和Objective-C类继承不必匹配。即您可以将Hospital
作为Contact
的子条目,并且仍然将Contact
实体映射到Contact
类,而不将Hospital
映射到Contact
的子类1}}类。它适用于Hospital
实体映射到(相同)Contact
类甚至NSManagedObject
(这是我怀疑你已经完成的)。
这可能看起来很混乱,但如果使用得当可以非常强大。
答案 1 :(得分:1)
所以是的,事实证明我确实需要一些睡眠;-)问题是子类没有包含在目标中。我知道当你有一个子类时,我遇到了类似的问题,并且它在目标中,但你也忘了在模型中定义自定义子类。