核心数据,NSPredicate,ANY key.path == nil

Amy*_*all 9 core-data nspredicate

我想出了一个使用子查询的解决方案,但我不明白为什么我第一次尝试做的事情没有用.

这是我的数据模型.我正在寻求建议.

在此输入图像描述

我可以将以下内容作为谓词:

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == %@", aTerrainObject];
Run Code Online (Sandbox Code Playgroud)

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

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

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == nil"];
Run Code Online (Sandbox Code Playgroud)

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

但是,以下工作正常:

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

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

Dav*_*ong 26

任何人都可以解释为什么,在搜索nil时,我不能使用ANY语法?

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

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == nil"];
Run Code Online (Sandbox Code Playgroud)

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

conditions.terrain
Run Code Online (Sandbox Code Playgroud)

这将通过获取SELF对象(一个Advice实例)并请求它来评估valueForKeyPath:@"conditions.terrain".此keypath的结果将是一个集合.你基本上是这样做的:

Advice *a = ...;
NSSet *conditions = [a conditions];
NSSet *terrains = [conditions valueForKey:@"terrain"];
Run Code Online (Sandbox Code Playgroud)

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

因此,你的谓词失败了.我尝试使用其他一些变体(使用[NSNull null]而不是nil等),但它们似乎都没有用.

因此,看起来你使用a SUBQUERY来解决这个问题就像你能得到的一样好.我强烈建议提交一份详细说明您的期望的错误,并表达您认为这应该有效的原因.