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

Posted

技术标签:

【中文标题】核心数据,NSPredicate,任何 key.path == nil【英文标题】:Core Data, NSPredicate, ANY key.path == nil 【发布时间】:2012-11-02 10:57:16 【问题描述】:

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

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

我可以做如下的谓词:

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

效果很好,并返回至少一个条件具有该地形类型的任何建议。

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

谁能解释为什么在搜索 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 等),但它们似乎都不起作用。

因此,您使用SUBQUERY 来解决此问题似乎与您所能获得的一样好。我强烈推荐 filing a bug 详细说明您的期望并说明您认为这应该有效的原因。

【讨论】:

优秀的回复。感谢您的详尽和准确。【参考方案2】:

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

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

以上说法不正确,NULLNIL可以互换使用。

相反,NSExpression Class Reference 给出了您的模式(@count)作为首选示例。

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

【讨论】:

以上是关于核心数据,NSPredicate,任何 key.path == nil的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 NSPredicate 不起作用[重复]

核心数据:在两个实体中查找的 NSPredicate

NSPredicate 在核心数据中的多对多关系

使用 AND 对多 NSPredicate 的核心数据

带有核心数据对象的 NSPredicate

使用 NSPredicate 获取核心数据对象数组?