核心数据,NSPredicate和多对多密钥

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

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

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

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

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

由于未捕获exception“NSInvalidArgumentException”而终止应用程序,原因:“不支持的谓词

如果我使用相同的谓词

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

不会抛出exception,但代码不能按预期工作:排除不应排除今天发生的事件。

我不知道如何testing排除的情况发生==零:下面的谓词

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

在运行时导致exception

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

但是,由于排除关系是可选的,我还需要testing它是否为零。

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

为了testing一个空的关系,你应该把对多关键字的计数与零进行比较。

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

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

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

在大家的帮助下,我最终设法确定了我的场景的正确谓词。 它看起来像一个NSDate对象被处理为双精度,但是,双从不像3.7,它总是像3.0因此,下面的谓词正确地在我的testing工作:

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

其中thisDate是仅包含日,月和年组件的NSDate对象(与ExcludedOccurrence实体的start属性相同)。

正如苹果公司的一些人所build议的那样,基本上使用@count聚合运算符来testing空关系。

再一次,谢谢你的帮助。 我仍然观察到文档有几个部分是有缺陷的(特别是在所有文档都可以正常工作的情况下,反而根本不起作用)。

所以,为了testing一个非空的关系,这实际上起作用:

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

阿什利·克拉克(Ashley Clark)给出的解决scheme给我提供了“在这里不允许的多键”

在迅速2,像这样的:

 request.predicate = NSPredicate(format: " relationship.@count != 0")