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

Posted

技术标签:

【中文标题】将 NSManagedObject 转换为子类类型的问题【英文标题】:Problems casting NSManagedObject to subclass type 【发布时间】: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;

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

【问题讨论】:

【参考方案1】:

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

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

需要注意的是,Entity 继承和 Objective-C 类继承不必匹配。 IE。您可以让Hospital 成为Contact 的子条目,并且仍然将Contact 实体映射到Contact 类,而没有Hospital 映射到Contact 类的子类。 Hospital 实体映射到(相同的)Contact 类甚至是 NSManagedObject(我怀疑你已经这样做了)是有效的。

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

【讨论】:

谢谢丹尼尔。 Hospital 扩展了 Contact 类和实体。因此,如果我无法摆脱这种情况,如何在使用 NSManagedObject 设置其 Contact 属性时让 Address 不抛出 InvalidArgExc?我只是假设将托管对象转换为正确的类型会解决它,并且是最快的解决方案。再次感谢 啊哈!!自定义子类未添加到目标中……该死;不敢相信我错过了。我应该知道,因为每当我看到 NSManagedObject 的子类总是作为 NSManagedObject 返回的类似问题时,要么你没有在模型中设置类属性,要么......你的类不在目标。把这一切都搞砸了;-) 谢谢丹尼尔【参考方案2】:

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

【讨论】:

感谢您返回并填写答案,因为它让我摆脱了困境!我发现有时当我(严重)解决项目文件中的合并冲突时,某些类的编译指令会丢失。由于一个模糊的原因,我无法弄清楚,尽管这发生在我的 NSManagedObject 子类上,它仍在编译。该死的。

以上是关于将 NSManagedObject 转换为子类类型的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何将 NSObject 模型类转换为 NSManagedObject 的子类?

如何在 NSManagedObject 子类中使用 Transformable 属性作为其实际类型?

如何将 NSManagedObject 的 NSKeyedUnarchive 子类导入核心数据?

如何使用 RKValueTransformer 将 NSString 转换为 Core Data NSManagedObject

无法将“NSManagedObject”类型的返回表达式转换为“字符串”类型?

无法将 String 类型的值转换为预期的参数类型 NSManagedObject