将 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