2010-01-27 61 views
13

我有一个核心数据模型,其中有一个实体A,它是一个抽象。实体B,C和D继承自实体A.实体A中定义了几个属性,B,C和D使用它们。将自定义方法添加到子类NSManagedObject

我想在我的模型代码中使用这种继承。除了属性之外,我想知道是否可以将方法添加到实体A中,这些实体在其子实体中实现。

例如:

  1. 我添加一个方法来为实体A的接口,它返回一个值和有一个参数
  2. 我添加此方法A,B,C的实施方式中,d
  3. 然后,我打电话executeFetchRequest:检索B的所有实例
  4. 我调用对象的方法检索,这应该调用包含在B的实施方法的实现

我曾尝试这一点,但在调用方法时,我得到:

[NSManagedObject方法名:]: 无法识别的选择发送到实例

我相信,这是因为对象通过返回executeFetchRequest:是某种代理对象。

有什么办法可以利用继承使用子类NSManagedObjects?

我真的希望能够做到这一点,否则我的模型代码将负责确定它处理的NSManagedObject类型,并根据类型执行特殊逻辑,这是不可取的。

任何帮助表示赞赏,在此先感谢。

回答

25

它应该工作。 executeFetchRequest:返回的对象是NSManagedObject(或其子类)的真实实例。 在CoreData中使用自定义类的步骤如下。假设你有实体A和B,其中B从A继承。 然后,你需要两个自定义类作为

@interface A:NSManagedObject{ 
} 
-(void)someMethod:(NSString*)a; 
@end; 
@interface B:A{ 
} 
-(void)someMethod:(NSString*)a; 
@end; 

然后将它们设置在Xcode数据建模,如下所示:

screenshot of XCode modeler

这样,CoreData正确的类自动分配到NSManagedObject时从数据库中获取。

+2

非常感谢!我的数据模型使用NSManagedObject;我甚至没有意识到我需要指定类名,完美的作品! – 2010-01-28 02:49:15

+9

我在这个答案中没有看到屏幕截图 - 有人可以取代它吗(Yuji)? – 2012-08-22 15:56:15

+0

很抱歉,截图不可用! :( – 2013-05-24 09:26:24

18

如果您收到该异常,则表示Core Data未使用您的自定义类。这里的关键是NSManagedObject - 这是Core Data为数据存储中的对象创建的对象。

如果您还没有,则需要创建一个继承自NSManagedObject的类,在其中添加自定义方法,然后将实体A设置为在对象模型工具中使用您的自定义类。如果实体B,CD等具有特定行为,则应该为您为实体A创建的类继承子类,并指定这些实体也使用子类。

实质上,您有一个并行层次结构:一个实体层次结构和另一个类。对于您的对象模型中的每个实体,您最终可能会得到实体X和类X

+1

谢谢你,你有正确的答案,但Yuji为我提供了真正指向正确方向的截图。如果我也可以接受你的答案,我会的。 – 2010-01-28 02:51:05

+0

当您更改实体类的名称时,很容易忘记xcdatamodel!你的回答为我节省了很多时间!非常感谢:-) – jpswain 2011-10-12 21:12:53

+0

+1非常感谢提示“set entity在对象模型工具中使用您的自定义类”。对我而言,我没有使用自动生成的类,所以我跳过了这一步! – 2012-10-17 19:52:01

1

我出于同样的根本原因有同样的错误,但它出现在不同的情况和不同的治疗方法。你的建议帮了我很多!

最初我创建了我的课,手工实现我的入门。我不知道有这个Xcode菜单。我认为这个链接永远不会存在!所以直到我添加并开始测试新的自定义方法(而不是setter/getters)时,我才开始发现错误。

我的解决方案是更改我的班级名称,让Xcode通过Editor->Create NS Mangage Object....重新创建我的班级。然后将旧代码剪切并粘贴到新班级中。代码没有区别!

Xcode似乎有某种内部链接,在代码中不明显。

2

在尝试使用我的自定义方法制作诀窍之前,尝试了大量调用我的NSManagedObject子类上的isMemberOfClass的解决方案之后。

[thing isMemberOfClass:[Thing class]]; 
[thing customMethod]; //was getting unrecognized selector sent to instance here before 
+0

这是我工作的唯一解决方案,我认为这与我的CoreData代码全部位于静态库内而不是直接在主应用程序中有关,但我并不完全确定这一点。 – BenV 2013-05-09 20:34:59

+0

这对我来说也有窍门,因为我的核心数据代码在静态库中,我将它用作其他应用程序的子项目+1作为答案@ micheal23 – Talha 2014-06-20 10:31:35

相关问题