如何获取所有对象A的一对多关系B的所有属性的NSSet

时间:2013-08-28 00:27:08

标签: ios objective-c core-data

假设我有一个包含数千个对象的实体A.这些对象中的每一个都与另一个实体B具有一对多的关系。实体B的一个属性是“部分”。

我想要实体A的所有对象中B的所有不同部分的NSSet。

如果我只想要A的一个对象的B的不同部分,我会使用:

[A valueForKeyPath:@"B.section"];

但是有没有一种有效的方法来获取A的所有对象?在我看来,获取A的所有对象然后迭代这个数组,执行上述操作是“太多工作”。当然可以毫不费力地完成它,但我希望我的核心数据天真只是意味着我不知道在一行中完成这个的技巧。

如何做到这一点?

谢谢!

根据要求澄清编辑:

假设一个人实体与车辆实体有多对多的关系。 假设Vehicles实体具有属性'color'。

我想为属于所有人的所有车辆提供所有颜色的NSSet。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,并且假设A - > B关系具有反B - >关系,名为a,则您的问题可以表述为:所有不同关系B.section不为零的B.a。对于与某些B.section相关联的每个B,这将获得A的每个不同值。

在这种情况下,您需要以下内容:

// Fetch B
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"B"];
// Fetch B that's related to an A
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"a != nil"];
[request setPredicate:predicate];

// Fetch distinct values of "section", return values as NSDictionary
[request setResultType:NSDictionaryResultType];
[request setReturnsDistinctValues:YES];
[request setPropertiesToFetch:@["section"]];

执行该操作并获得NSDictionary数组。字典有一个名为section的密钥,对应B.section。只包含不同的值。

答案 1 :(得分:0)

假设您有以下托管对象类:

@interface A: NSManagedObject

@property (nonatomic, retain) NSSet *BSet;

@end

如果你有一个名为 aObj A 实例,并且想要使用唯一的部分获取BSet中的所有对象,则可以执行以下操作:

NSArray *uniqueBSections = 
                  [aObj valueForKeyPath:@"@distinctUnionOfObjects.BSet.section"];