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

Posted

技术标签:

【中文标题】如何获取所有对象A的一对多关系B的所有属性的NSSet【英文标题】:How to fetch the NSSet of all attributes of a one-to-many relationship B of all objects A 【发布时间】:2013-08-28 00:27:07 【问题描述】:

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

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

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

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

但是有没有一种有效的方法来为 A 的所有对象获取此信息?在我看来,获取 A 的所有对象然后迭代这个数组,执行上述操作是“太多的工作”。当然可以轻松完成,但我希望我的核心数据天真仅仅意味着我不知道如何在一行中完成此操作。

如何做到这一点?

谢谢!

编辑要求澄清:

假设 Person 实体与 Vehicles 实体具有一对多关系。 假设 Vehicles 实体有一个属性“color”。

我想要属于所有人的所有车辆的所有颜色的 NSSet。

【问题讨论】:

[A valueForKeyPath:@"B.section"]; 不会给你 B 的不同部分,它会给你 B 的所有部分。 请稍微澄清一下你的问题——我已经读了 3 遍了,但仍然不清楚你在寻找什么系列。对于给定的 A 部分,您是否想要一组所有 B 实体?您想要一组按唯一部分过滤的所有 B 实体吗? 【参考方案1】:

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

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

// 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。仅包含不同的值。

【讨论】:

【参考方案2】:

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

@interface A: NSManagedObject

@property (nonatomic, retain) NSSet *BSet;

@end

如果您有一个名为 aObjA 实例,并且您想要获取 BSet 中具有唯一部分的所有对象,您可以执行以下操作:

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

【讨论】:

事实上我认为 [aObj valueForKeyPath:@"B.section"] 会做你所描述的。这与我想要的不同之处在于,我需要 A 的所有对象的 NSSet,而不仅仅是单个 aObj 实例。不过感谢您的回复!

以上是关于如何获取所有对象A的一对多关系B的所有属性的NSSet的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 中一对多关系的正确 NSPredicate 格式

核心数据:获取特定对象的多对多关系中的所有实体?

获取核心数据对象,其中一对多关系包含集合中的所有对象

将表示一对多关系的 NSSet 绑定到 NSArrayController 的选择

NSPredicate:“添加”一对多关系CoreData中所有实体的属性值

以一对多关系从 coredata 中获取所有对象