核心数据,NSPredicate和

我有一个Core Data模型,其中一个Task实体包含一个可选的多对多关系excludedOccurrences。 excludeOccurrences的一个属性是start,它是一个NSDate对象。 ExcludedOccurrence实体与Task实体具有反向强制一对一关系。

为了获取指定日期的任务,我需要确保指定的一天不会显示为任何ExcludedOccurrence实体的开始属性。 因此,我尝试使用的一个子谓词

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"(ALL excludedOccurrences.start != %@))", today];

今天是今天的NSDate对象,仅包括日,月和年组件。 所有排除事件的开始属性还包括日,月和年组件。

虽然这应该很好,至少阅读核心数据和NSPredicate的文档,但我收到以下错误消息:

由于未捕获的异常'NSInvalidArgumentException'而终止应用,原因:'不支持的谓词

如果我使用等价的谓词

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"!(ANY excludedOccurrences.start == %@))", today];

不会抛出异常,但代码无法按预期工作:不应排除今天发生的事件,而应排除此事件。

我不知道如何测试排除的情况发生==无:以下谓词

NSPredicate *nilPredicate = [NSPredicate predicateWithFormat: @"(excludedOccurrences == nil)"];

在运行时导致异常

一对多的钥匙不允许在这里

但是,由于excludedOccurrences关系是可选的,我还需要测试它是否为零。

我如何处理这个问题? 先谢谢你。


要测试一个空的关系,你应该将对多关键字的计数与零比较。

[NSPredicate predicateWithFormat:@"excludedOccurrences.@count == 0"];

至于你的子谓词,请注意,尽管你可以在整个谓词中多次使用该修饰符,但在最终谓词中只能有一个ALLANY修饰符。

不好ANY foo.bar = 1 AND ALL foo.baz = 2
好的: ANY foo.bar = 1 AND !(ANY foo.baz != 2)


在你们所有人的帮助下,我终于设法为我的场景确定正确的谓词。 它看起来像一个NSDate对象被处理为double,但是,double从来没有像3.7,它总是像3.0因此,下面的谓词正确地在我的测试中工作:

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"(excludedOccurrences.@count == 0 || (excludedOccurrences.@count > 0 && NONE excludedOccurrences.start == %@))",thisDate];

其中thisDate是仅包含日,月和年组件的NSDate对象(如ExcludedOccurrence实体的start属性的情况。

正如Apple的一些人所建议的那样,基本上使用@count聚合运算符来测试空关系。

再次感谢您的帮助。 我仍然观察到文档在多个部分中存在缺陷(特别是在所有文档都可以正常工作的同时,它根本不起作用)。


因此,为了测试非空关系,这实际上起作用:

[NSPredicate predicateWithFormat:@"relationship.@count != 0"]

Ashley Clark给出的解决方案给我提供了“在此不允许的多对多密钥”

链接地址: http://www.djcxy.com/p/60625.html

上一篇: Core Data, NSPredicate and to

下一篇: Is it possible to specify a minimum heap size requirement?