【问题标题】:How i can access Sub-Entity attributes from Suber-Entity in Core data我如何从核心数据中的子实体访问子实体属性
【发布时间】:2012-01-31 06:42:35
【问题描述】:

我在核心数据中有一个名为 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的屏幕截图

【问题讨论】:

  • 所以您的子实体的成绩元素 ID 也为 2?这似乎是一个不寻常的结构,并且将实体类称为 isBoolean 之类的名称会非常令人困惑。如果您获取的对象只是一个元素而不是您的子实体之一,那么您的代码也会在 elementData.value 上崩溃(不是给编译器警告吗?)。
  • 这是我在这里写的但没有编译的简短代码,我的问题是我如何从超级实体访问子实体属性是否可行?

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    根据修改后的问题更新

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

    每个子实体都相当于您的 Element 实体的一个子类 - 因此它将具有元素属性以及您在子实体中定义的新属性。如果您创建了自定义 NSManagedObject 子类,它也会在类术语中继承。

    谈论从超级实体中访问子实体的属性是没有意义的。

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


    原始答案,90% 仍然有效

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

    但是从超实体内部,不,这没有任何意义。它与类继承相同——您无法从 UIView 中访问 .text ,因为 UILabel 是它的子类。但是你可以有一个 UIView 对象的列表,检查其中一个是否实际上是 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)。

    【讨论】:

    • 感谢您的回答,我同意您的看法。能否请您告诉我如何从获取的请求数据中访问这些属性。对于默认获取的请求是否有任何其他代码。
    • 对不起,因为 elementData 是 Element 实体的对象,所以它不起作用,因此不会进入 if case 语句
    • 如果它是一个元素实体,那么您应该无法访问该值。在托管对象上下文中,您实际上有没有除 Elements 之外的任何实体?
    • 不,我获取了与 Element 实体具有一对多关系的 Group 实体,并从关系中获取 Element,我想访问子实体。任何事情都需要澄清你的模棱两可我准备好了非常感谢您的陪伴。
    • 如果您没有创建子实体,就不会有任何实例。我不确定您是否了解子实体的用途——它们就像子类。因此,在您的关系中可能会混合使用 Element 实体和子实体,但 Element 实体与子实体无关,除非您的元素具有可以包含子实体的关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多