核心数据、NSPredicate、任何key.path == nil

9
我想出了一个使用子查询的解决方案,但我不明白为什么我最初尝试做的事情没有起作用。
这是我的数据模型。我正在获取建议。
``` enter image description here ```
我可以使用以下语句作为谓词:
[NSPredicate predicateWithFormat:@"ANY conditions.terrain == %@", aTerrainObject];

这个功能可以很好地运行,并返回任何至少一个条件具有该地形类型的建议。

然而,当我尝试执行此操作时,它失败了:

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

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

然而,以下内容可以正常工作:

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

能有人解释一下,为什么在搜索nil时不能使用ANY语法吗?

2个回答

26

有人可以解释一下,为什么在搜索nil时我不能使用ANY语法吗?

没错! 这就是发生的事情。

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

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

conditions.terrain
这将通过获取“SELF”对象(一个“Advice”实例)并请求“conditions.terrain”键路径进行评估。该键路径的结果将是一个集合。您实际上正在执行以下操作:

这将通过获取SELF对象(一个Advice实例)并请求“conditions.terrain”键路径进行评估。该键路径的结果将是一个集合。您实际上正在执行以下操作:

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

因此,您拥有一组(潜在的)Terrain实例。现在,在Objective-C中我们知道关于集合的一件事是,它们不能包含nil。他们只能包含对象。这意味着当执行谓词的ANY部分时,它将迭代数组中的项目,并查看它们中没有一个是nil

因此,您的谓词失败了。我尝试使用其他变体(例如使用[NSNull null]而不是nil等),但似乎都不起作用。

因此,您使用SUBQUERY来解决这个问题是最好的选择。我强烈建议提交错误报告,详细说明您的期望并解释为什么您认为应该起作用。


非常好的回复。感谢您的细致和精确。 - Pedro Borges

0

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

让我感到困惑的是你的子查询正在工作...

上述内容不正确,因为NULLNIL可以互换使用。

相反,NSExpression Class Reference提供了与您的模式(带有@count)完全相同的首选示例。

您是否检查过地形关系是否是可选的?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接