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
等等),但它们似乎都不起作用
因此,使用
子查询
来解决这个问题似乎是您所能得到的最好结果。我强烈建议您详细说明您的期望,并说明您认为这应该奏效的原因。非常好的回答。谢谢你的详尽和准确。