【发布时间】:2010-11-12 22:55:32
【问题描述】:
我有一个核心数据模型,其中一个任务实体包含一个可选的多对多关系排除事件。 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];
没有抛出异常,但是代码没有按预期工作:今天发生的不应该被排除的事件被排除了。
我也不确定如何测试excludedOccurrences == nil 的情况:以下谓词
NSPredicate *nilPredicate = [NSPredicate predicateWithFormat: @"(excludedOccurrences == nil)"];
在运行时导致异常
这里不允许使用多对多键
但是,由于excludedOccurrences关系是可选的,所以我还需要测试它是否为nil。
我该如何处理?提前谢谢你。
【问题讨论】:
标签: iphone core-data nspredicate