我如何从核心数据中的Suber-Entity访问Sub-Entity属性

时间:2012-01-31 06:42:36

标签: iphone ios ios4 core-data core-data-migration

我在核心数据中有一个名为element的超级实体,并且有两个子实体叫做(IsBoolean,IsGrade)我试图从下面的代码中访问这些子实体属性。我需要你对这个问题的帮助

---------------------核心数据结构-------------------- 超级实体[Element-> elmentID] 子实体[IsBoolean-> value] + [IsGrade-> value]

----------------------简要代码----------------------- -----

NSFetchRequest *formRequest = [[NSFetchRequest alloc]init];
NSEntityDescription *formEntity = [NSEntityDescription entityForName:@"Element" inManagedObjectContext:ManagedObjectContext];
NSSortDescriptor *formDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"elementID" ascending:YES]; 
NSPredicate *formPredicate = [NSPredicate predicateWithFormat:@"elementID==%d",2];
[formRequest setPredicate:formPredicate];
[formRequest setEntity:formEntity]; 
[formRequest setSortDescriptors:[NSArray arrayWithObject:formDescriptor]]; 
[formRequest setIncludesSubentities:YES];
resultController_= [[NSFetchedResultsController alloc] initWithFetchRequest:formRequest managedObjectContext:ManagedObjectContext sectionNameKeyPath:nil cacheName:nil  ];
resultController_.delegate =self;
for (Element *elementData in resultController_) {
        // I can access super entity attribute 
        NSlog(@"%@",elementData.elementID);

        // Here i can't access sub entity attribute from super entity 
        NSLog(@"%@",elementData.value);

}

找到datamodel enter image description here

的以下屏幕截图

2 个答案:

答案 0 :(得分:1)

请注意,子实体不必是子类。 必须匹配的类层次结构和实体层次结构。在大多数情况下,将它们匹配是有意义的,但有些情况并非如此。事实上,没有匹配可能会给你很大的灵活性。

您可以拥有一个实体 book *和相应的** Book 类,以及一个实体 author 和一个相应的 Author 类。在这种情况下,他们没有共同的超级实体。但是类很可能有一个共同的超类来定义和实现例如@property NSString *name;@property UIImage *image;及相关方法。

答案 1 :(得分:0)

根据修正后的问题进行更新

除非您已将托管对象添加到子实体的上下文中,否则 将不会 您的子实体的任何实例。

每个子实体等同于Element实体的子类 - 因此它将具有元素属性,以及您在子实体中定义的新属性。如果您已创建自定义NSManagedObject子类,它还将在类术语中继承。

谈论从超级实体中访问子实体的属性是缺少这一点。

要添加子实体的实例,您只需使用子实体名称插入实体,就像插入任何其他托管对象一样。


原始答案,其中90%仍然有效

您不是试图从超级实体访问它们,而是从正在执行获取请求的任何内容中访问它们。在这种情况下,如果检查返回的对象是否属于适当的类或具有相关属性,则为是。

但是从一个超级实体内部,不,这没有任何意义。它与类继承相同 - 你无法从UIView中访问.text,因为UILabel是它的子类。但是你可以有一个UIViews对象列表,检查其中一个实际上是UILabel,然后访问它的.text属性。

对于返回实体和子实体混合的获取请求,您可以执行类似

的操作
if ([elementData.entity.name isEqualToString:@"IsBoolean"]) // means it is the isBoolean sub-entity
    NSLog(@"%@",elementData.value);

稍微好一些,你会得到属性字典:

NSDictionary *attributes = elementData.entity.attributesByName;
if ([attributes objectForKey:@"value"]) // Means there is an attribute called "value"
    NSLog(@"%@",elementData.value);

对于后一种情况,字典中充满了NSAttributeDescription对象,这些对象告诉您正在处理的属性类型。请参阅各种核心数据类引用(NSManagedObjectNSEntityDescriptionNSAttributeDescription)。