将NSManagedObject转换为子类类型的问题

时间:2011-12-30 03:59:44

标签: core-data casting relationship nsmanagedobject

我正在为我的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;

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

2 个答案:

答案 0 :(得分:2)

演员不是你的问题。转换不会改变对象的类 - 只是编译器认为的内容。

您的对象是NSManagedObject,但不是Contact实例。在您的代码中,您拥有的objectHospital实体。仔细检查Hospital实体是否设置为使用Contact类(或子类)。

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

这可能看起来很混乱,但如果使用得当可以非常强大。

答案 1 :(得分:1)

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