2012-11-02 89 views
8

我想出了一个使用子查询的解决方案,但我不明白为什么我先试图做的没有工作。核心数据,NSPredicate,任何key.path ==无

这是我的数据模型。我正在阅读建议。

enter image description here

我可以做以下的断言:

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

工作正常,并返回任何忠告,其中的条件中的至少一个具有地形类型。

然而,当我尝试这样做,它失败:

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

我想要做的是返回任何忠告,其中的至少一个条件不具备地形类型集。

但是,下列情况工作:

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

任何人能解释为什么,零搜索时,我不能使用ANY语法?

+0

好点。 + 1 –

回答

24

任何人都可以解释为什么,当搜索零,我不能使用任何语法?

是的!这是发生了什么。

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

首先,让我们打破这种成相应的左侧和右侧的表达式:

conditions.terrain 

这将通过采取SELF对象(Advice实例),并请valueForKeyPath:@"conditions.terrain"进行评估。这个keypath的结果将是一个集合。你基本上做:

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

所以,你有(潜在)Terrain实例的集合。现在,我们对Objective-C中的集合了解多少?一件事,他们不能包含nil。它们只能包含对象。这意味着当它执行谓词的ANY部分时,它将遍历数组中的项目并查看它们中没有一个是nil

因此,您的谓词失败。我试着玩一些其他的变化(使用[NSNull null]而不是nil等),但没有一个似乎工作。

因此,看起来您使用SUBQUERY来解决这个问题就像你可以得到的那样好。我强烈建议filing a bug详细说明你的期望,并表达你为什么认为这应该工作。

+1

+1进行深入的解释。 –

+0

优秀的回复。感谢您彻底和准确。 –

0

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

令我百思不解的是,你的子查询的工作...

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

取而代之的是,NSExpression Class Reference恰好给出了您的模式(使用@count)作为首选示例。

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

+0

是的,它是可选的。 –

相关问题