NSPredicate 表达式中 SUBQUERY 的快速解释

Posted

技术标签:

【中文标题】NSPredicate 表达式中 SUBQUERY 的快速解释【英文标题】:Quick Explanation of SUBQUERY in NSPredicate Expression 【发布时间】:2010-09-28 08:36:43 【问题描述】:

Apple 关于 SUBQUERY 关键字的文档似乎为零,我在 SO 或 Google 上找不到关于它的简单解释。这是一个阴谋! ;)

,能否请内圈的人快速解释一下它的语法,以便我可以使用它?

SUBQUERY(Bs, $x, $x IN %@)

谢谢

【问题讨论】:

【参考方案1】:

对于不太了解文档内容的人来说,SUBQUERY 本质上是这样的:

SUBQUERY(collection, variableName, predicateFormat)

并且可以(简单地)像这样实现:

id resultingCollection = ...; //a new collection, either a mutable set or array
NSMutableDictionary * substitutions = [NSMutableDictionary dictionary];
NSPredicate * p = [NSPredicate predicateWithFormat:predicateFormat];
for (id variable in collection) 
  [substitutions setObject:variable forKey:variableName];
  NSPredicate * filter = [p predicateWithSubstitutionVariables:substitutions];
  if ([filter evaluateWithObject:collection] == YES) 
    [resultingCollection addObject:variable];
  

return resultingCollection;

所以简而言之,SUBQUERY 基本上是获取对象的集合,并根据SUBQUERY 的谓词表达式过滤掉各种对象,并返回结果集合。 (而且谓词本身可以包含其他SUBQUERYs)

例子:

NSArray * arrayOfArrays = [NSArray arrayWithObjects:
                           [NSArray arrayWithObjects:....],
                           [NSArray arrayWithObjects:....],
                           [NSArray arrayWithObjects:....],
                           [NSArray arrayWithObjects:....],
                           [NSArray arrayWithObjects:....],
                           [NSArray arrayWithObjects:....],
                           nil];
NSPredicate * filter = [NSPredicate predicateWithFormat:@"SUBQUERY(SELF, $a, $a.@count > 42)"];
NSArray * filtered = [arrayOfArrays filteredArrayUsingPredicate:filter];
//"filtered" is an array of arrays
//the only arrays in "filtered" will have at least 42 elements each

【讨论】:

您的 NSPredicate 无法编译:捕获 "NSInvalidArgumentException"、"无法解析格式字符串 "SUBQUERY(SELF, $a, $a.@count > 2)"" @cfisher 次要更正:这是运行时错误,而不是编译错误。 (不是想成为一个混蛋。)【参考方案2】:

This is what a subquery evaluates to.(来自this mailing list thread,在 Google 中“NSPredicate 子查询”排名第一。)该文档还解释了谓词格式字符串语法与它的关系。

【讨论】:

该死!我不敢相信我错过了。非常感谢。 你怎么知道用什么字母?有些地方我看到了 $x 有些地方我看到了 $s,有些地方我看到了 $a,而且我无法通过上下文看到 $x 和 $s 之间的任何差异。 @orange80:变量名由您选择。请参阅我在答案中链接到的文档。如果你知道 Python,就像说[x for x in collection if (some condition involving x)]。据我所知,变量名甚至不必是单个字母。 请注意:此时此帖子是谷歌首次点击“nspresicate subquery”:) +1 链接【参考方案3】:

子查询表示一个谓词(第三个参数 - $x IN %@),它在关系(第一个参数 - Bs)的所有对象(第二个参数 - $x - 它就像 foreach 中的变量名)上进行评估。与常规查询类似,返回对象列表。

我在很多地方看到人们几乎教条地使用$x,但objects 关系中的$object 也很有意义(或$city 中的$city...):)

前段时间我写了一篇关于SUBQUERY 的博文。您可以查看here。

【讨论】:

以上是关于NSPredicate 表达式中 SUBQUERY 的快速解释的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 NSPredicate 中使用嵌套的 SUBQUERY?

带有 SUBQUERY 的 NSPredicate 不起作用

NSPredicate 中使用的 SUBQUERY( ) 是不是不支持所有集合运算符,如 @max、@min?

子查询中的 NSPredicate

具有多对多关系的核心数据 - 在 SUBQUERY 中使用 ALL 创建 NSPredicate

如何构建这个 SUBQUERY NSPredicate?