我有一个核心数据模型,我有一个实体A,这是一个抽象。实体B,C和D继承自实体A.实体A中定义了几个由B,C和D使用的属性。
我想在我的模型代码中利用这种继承。除了属性之外,我想知道是否可以向实体A添加方法,这些方法在它的子实体中实现。
例如:
executeFetchRequest:
来检索B 我试过这个,但在调用方法时,我收到了:
[NSManagedObject methodName:]: 无法识别的选择器发送到实例
我认为这是因为executeFetchRequest:
返回的对象是某种代理对象。
有没有办法利用子类化的NSManagedObjects来利用继承?
我真的希望能够这样做,否则我的模型代码将负责确定它正在处理的NSManagedObject的类型,并根据类型执行特殊逻辑,这是不可取的。
提前感谢任何帮助。
答案 0 :(得分:25)
它应该工作。 executeFetchRequest:
返回的对象是NSManagedObject
s(或其子类)的实例。
在CoreData中使用自定义类的步骤如下。假设您有实体A和B,其中B继承自A.
然后你需要两个自定义类
@interface A:NSManagedObject{
}
-(void)someMethod:(NSString*)a;
@end;
@interface B:A{
}
-(void)someMethod:(NSString*)a;
@end;
然后在XCode数据建模器中设置它们,如下所示:
这样,当从数据库中获取时,CoreData会自动为NSManagedObject
分配正确的类。
答案 1 :(得分:18)
如果您收到该异常,则表示Core Data未使用您的自定义类。这里的关键是NSManagedObject
- 这是为数据存储中的对象创建的对象Core Data。
如果您还没有,则需要创建一个继承自NSManagedObject
的类,在那里添加自定义方法,然后设置实体A
以在对象中使用自定义类模型工具。如果实体B
,C
,D
等具有特定行为,则应将您为实体A
创建的类子类化,并将这些实体分配为使用子类。
基本上,您有一个并行层次结构:一个实体层次结构,另一个类别。对于对象模型中的每个实体,您最终可能会得到实体X
和类X
。
答案 2 :(得分:2)
在尝试使用我的自定义方法之前尝试了很多解决方案,在我的NSManagedObject子类上调用isMemberOfClass后,这就成了伎俩。
[thing isMemberOfClass:[Thing class]];
[thing customMethod]; //was getting unrecognized selector sent to instance here before
答案 3 :(得分:1)
由于同样的潜在原因,我也有同样的错误,但它出现在不同的情况和不同的治疗方法。你的建议给了我很多帮助!
最初我创建了我的课程,手工实现我的入门。我不知道有一个Xcode菜单。我认为链接从未出现过!所以直到我添加并开始测试新的自定义方法(不是setter / getters)才开始出错。
我的解决方案是更改我的类的名称,让Xcode通过Editor->Create NS Mangage Object....
为我的条目重新创建类,然后将旧代码剪切并粘贴到新类中。代码没有区别!
Xcode似乎有某种内部链接在代码中不明显。