Core data 核心数据,NSPredicate,任意键。路径==nil

Core data 核心数据,NSPredicate,任意键。路径==nil,core-data,nspredicate,Core Data,Nspredicate,我提出了一个使用子查询的解决方案,但我不明白为什么我首先要做的事情不起作用 这是我的数据模型。我在征求意见 作为谓词,我可以执行以下操作: [NSPredicate predicateWithFormat:@"ANY conditions.terrain == %@", aTerrainObject]; 这很好,并且返回至少一个条件具有该地形类型的任何建议 但是,当我尝试这样做时,它失败了: [NSPredicate predicateWithFormat:@"ANY conditions.

我提出了一个使用子查询的解决方案,但我不明白为什么我首先要做的事情不起作用

这是我的数据模型。我在征求意见

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

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == %@", aTerrainObject];
这很好,并且返回至少一个条件具有该地形类型的任何建议

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

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == nil"];
我想做的是返回任何一条建议,其中至少有一条条件没有设置地形类型

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

[NSPredicate predicateWithFormat:@"SUBQUERY(conditions, $x, $x.terrain == nil).@count > 0"];
有人能解释一下为什么在搜索nil时,我不能使用
ANY
语法吗?

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

让我困惑的是您的子查询正在工作

上述情况不正确,因为
NULL
NIL
可以互换使用

相反,将您的模式(带有
@count
)作为首选示例

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

有人能解释为什么在搜索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"];
因此,您有一组(潜在的)
地形
实例。现在,我们对Objective-C中的集合了解多少?首先,它们不能包含
nil
。它们只能包含对象。这意味着当它执行谓词的
ANY
部分时,它将遍历数组中的项,并查看它们都不是
nil

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


因此,使用
子查询
来解决这个问题似乎是您所能得到的最好结果。我强烈建议您详细说明您的期望,并说明您认为这应该奏效的原因。

非常好的回答。谢谢你的详尽和准确。