为什么我必须在子类化和抽象实体时设置父实体?

时间:2011-07-11 03:11:19

标签: xcode cocoa inheritance core-data subclass

我遇到的问题是我无法分配子类的属性,除非我将子类实体的Parent Entity属性设置为抽象超类的实体。

在XCode 4.0.2中,这是我所指的Parent Entity属性:

enter image description here

我不知道的是我认为父实体是用于实体之间的父子关系,而对象关系只是由类定义捕获。

实施例

实体A,B和C:

  • A是类型A的抽象实体,具有以下属性:
    • y:string
    • z:string
  • B是A类型的实体,没有属性
  • C是A类型的实体,没有属性

A,B和C类:

@interface A : NSManagedObject {
}
@property (nonatomic, retain) NSString * y;
@property (nonatomic, retain) NSString * z;

@interface B : A {
}
@interface C : A {
}

问题

如果我没有将实体B和C的父实体设置为实体A,那么当我尝试时:

NSEntityDescription *be = [[mom entitiesByName] objectForKey:@"B"];
B *b = [[NSManagedObject alloc] initWithEntity:be
                insertIntoManagedObjectContext:moc];

b.y = @"test"; // <<-- This line causes the following error:

我明白了:

-[NSManagedObject setY:]: unrecognized selector sent to instance

如果我设置了父实体,它似乎有效,除了持久存储到实体的实体似乎是A而不是B.

1 个答案:

答案 0 :(得分:3)

您还记得将实体B的类设置为B类吗?如果是,你应该看一下分配给b的指针的类型......它实际上是B *吗?看起来它可能是一个NSManagedObject *,基于你得到的错误,并根据-initWithEntity:insertIntoManagedObjectContext:的文档......

  

动态生成的子类   将基于指定的类   由实体,所以指定一个自定义   你的模型中的类将取代   class传递给alloc。

......如果您的模型配置正确,我认为您应该获得B *。