过滤与核心数据的关系

Posted

技术标签:

【中文标题】过滤与核心数据的关系【英文标题】:Filtering relationships with Core Data 【发布时间】:2011-12-09 13:05:46 【问题描述】:

我设置了一个 Core Data 对象图,这样

Grandparent--(hasMany)-->>Parent--(hasMany)-->>Child

每个实体都有一个'modified' 属性。我想执行一个提取,返回每个祖父母实体,并在某个日期之后修改日期。这应该包含在该点之后修改日期的所有父实体,与子实体相同。

我可以使用

轻松获取祖父母列表
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"modified > %@", lastSyncDate];

有没有办法写一个谓词,以便我可以用同样的方式过滤它的关系?谢谢!

【问题讨论】:

【参考方案1】:

你应该可以做这样的事情:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"modified > %@ OR ANY parents.modified > %@ OR ANY parents.children.modified > %@", 
                          lastSyncDate,
                          lastSyncDate,
                          lastSyncDate];

ParentChild 的属性分别称为 parentschildren。只需将它们更改为您所称的任何名称。)

我建议您阅读以下内容: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795-215891

更新

看来你不能这样做。我认为您实际上需要使用SUBQUERY。这个问题与您想要做的类似: What's better way to build NSPredicate with to-many deep relationships?

【讨论】:

这会抛出异常:'NSInvalidArgumentException',原因:'这里不允许多对多键' 对不起,我没有能力正确测试它,但你说得对,这实际上不会起作用。我已经更新提到SUBQUERY 和另一个类似问题的链接。希望这能让你走上正轨。【参考方案2】:

我最终只是抓住了我的整个对象图并使用过滤关系

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"modified > %@", lastSyncDate];
NSArray *modifiedChildren = [[parent.children allObjects] filteredArrayUsingPredicate:predicate];

它的效率不是很高,但似乎可以解决问题。

【讨论】:

以上是关于过滤与核心数据的关系的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个基于父关系过滤核心数据对象的 NSFetchRequest?

排序和过滤核心数据关系的更有效方法是啥?

对许多实体和实体关系进行过滤的核心数据提取

按祖父母实体关系过滤核心数据

NSPredicate 按属性过滤核心数据关系 NSSet

如何按不相关的实体过滤核心数据