我在核心数据中有一个名为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
的以下屏幕截图答案 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对象,这些对象告诉您正在处理的属性类型。请参阅各种核心数据类引用(NSManagedObject,NSEntityDescription和NSAttributeDescription)。