我有一个核心数据模型,其中任务实体包含一个可选的多对多关系排除事件。excludeOccurrences 的属性之一是 start,它是一个 NSDate 对象。ExcludedOccurrence 实体与 Task 实体具有相反的强制一对一关系。
为了获取指定日期的任务,我需要确保指定日期不会作为任何 ExcludedOccurrence 实体的开始属性出现。因此,我尝试使用的子谓词之一是
NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"(ALL excludedOccurrences.start != %@))", today];
其中 today 是今天的 NSDate 对象,仅包括日、月和年组件。所有排除的事件开始属性还仅包括日、月和年组件。
虽然这应该没问题,至少阅读 Core Data 和 NSPredicate 的文档,我收到以下错误消息:
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“不支持的谓词
如果我使用等价谓词
NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"!(ANY excludedOccurrences.start == %@))", today];
没有抛出异常,但是代码没有按预期工作:今天发生的不应被排除的事件被排除在外。
我也不确定如何测试 excludeOccurrences == nil 的情况:以下谓词
NSPredicate *nilPredicate = [NSPredicate predicateWithFormat: @"(excludedOccurrences == nil)"];
在运行时导致异常
此处不允许使用对多键
但是,由于excludedOccurrences 关系是可选的,所以我还需要测试它是否为nil。
我该如何处理?先感谢您。