9

我想出了一个使用子查询的解决方案,但我不明白为什么我首先尝试做的事情没有奏效。

这是我的数据模型。我正在获取建议。

在此处输入图像描述

我可以执行以下操作作为谓词:

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == %@", aTerrainObject];

工作正常,并返回至少一个条件具有该地形类型的任何建议。

但是,当我尝试这样做时,它失败了:

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == nil"];

我想要做的是返回任何一条建议,其中至少有一个条件没有设置地形类型。

但是,以下方法确实有效:

[NSPredicate predicateWithFormat:@"SUBQUERY(conditions, $x, $x.terrain == nil).@count > 0"];

谁能解释为什么在搜索 nil 时我不能使用ANY语法?

4

2 回答 2

26

谁能解释为什么在搜索 nil 时,我不能使用 ANY 语法?

是的!这是正在发生的事情。

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == nil"];

首先,让我们将其分解为适当的左右表达式:

conditions.terrain

这将通过获取SELF对象(一个Advice实例)并请求valueForKeyPath:@"conditions.terrain". 此键路径的结果将是一个集合。你本质上是在做:

Advice *a = ...;
NSSet *conditions = [a conditions];
NSSet *terrains = [conditions valueForKey:@"terrain"];

因此,您有一组(潜在)Terrain实例。现在,我们对 Objective-C 中的集合了解多少?一方面,它们不能包含nil. 它们只能包含对象。这意味着当它执行ANY谓词的一部分时,它将遍历数组中的项目并看到它们都不是nil.

因此,您的谓词失败了。我尝试使用其他一些变体(使用[NSNull null]代替nil等),但它们似乎都不起作用。

因此,您使用 aSUBQUERY来解决这个问题似乎与您所能得到的一样好。我强烈建议您提交一个错误,详细说明您的期望并说明您认为这应该起作用的原因。

于 2012-11-02T17:56:38.130 回答
0

我相信你不能nil在查询中使用。您可能应该使用NULL或格式字符串构造,例如 "ANY conditions.terrain == %@", nil.

令我困惑的是你的子查询正在工作......

以上是不正确的,因为NULL可以NIL互换使用。

相反,NSExpression 类参考准确地给出了您的模式(带有@count)作为首选示例。

你检查地形关系是可选的吗?

于 2012-11-02T11:14:29.260 回答