使用几个NSManagedObject

时间:2012-12-23 16:48:12

标签: ios core-data nsmanagedobject

我的问题非常简单。我在CoreData中有10个不同的实体,都有相同的属性(名称,描述......)。要以这种方式访问​​这些属性:

MyEntity *entity=...;
MyEntity2 *entity2=...;
...
MyEntity10 *entity10=...;

[self myfunction:AnEntity];

将随机对象发送到函数

之后
-(void)myfunction:(id)myentity

在这里我想使用一个可以访问实体属性的变量,无论它是MyEntity类还是MyEntity2的国王......问题是我做不到:

id myobject=myentity;
NSLog(@"%@", myobject.name);

如果有人有解决方案,以避免测试对象的类:) 谢谢!

2 个答案:

答案 0 :(得分:2)

如果您有10个不同的实体,我认为是时候转移到NSManagedObject子类了。然后,您可以定义包含所有共享属性的协议,并声明NSManagedObject子类符合该协议。然后你的电话就变成了

-(void)myfunction:(id<SharedAttributesProtocol>)myObject

{
    NSLog(@"%@", myObject.name);
}

您提到“description”是您的共享属性之一。 -description方法已经定义,因此您可能希望为该属性选择其他名称。

使用父NSEntity作为公共属性的这个缺点是你最终得到一个非常宽的表。此表具有所有常用属性,但也包含每个子实体的所有不同属性。根据您的对象的大小,这将是iOS下的性能影响,尽管它在OS X上并不那么糟糕。

答案 1 :(得分:0)

实际上你可以调用

[myobject valueForKey:@"name"]

甚至

[myobject name]

在您的函数中,因为这些方法是在运行时解析的。如果myobject具有“name”属性,则这将起作用,否则它将在运行时崩溃。

更清洁的解决方案是使用公共属性MyEntityname等定义一个“父实体”description。然后,您可以定义子实体MyEntity1,{{ 1}},...将MyEntity2作为“父实体”。这些子实体继承父实体的所有属性/关系,并且可以具有其他属性和关系。

相应的托管对象子类是MyEntity类的子类。你的功能可能如下所示:

MyEntity

您可以使用任何子类的实例调用它:

- (void)myfunction:(MyEntity *)myentity
{
     NSLog(@"%@", myentity.name);
}