【发布时间】:2010-11-23 18:47:45
【问题描述】:
我有一个核心数据模型,其中任务实体包含一个可选的多对多关系 ExcludedDays 到 ExcludedDay 实体。 ExcludedDay 的属性之一是 day,它是一个 NSDate 对象。 ExcludedDay 实体与 Task 实体具有相反的强制一对一关系。
为了获取指定日期的任务,我需要确保指定日期不显示为任何 ExludedDay 实体的日期属性。
我开始尝试
NSPredicate *dayIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"ALL excludedDays.day != %@", today];
但是,尽管文档说,ALL 不起作用并且应用程序抛出异常:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“不支持的谓词。
在这个论坛上发布了同样的问题后,我在很多人的帮助下设计了以下谓词:
NSPredicate * dayIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"excludedDays.@count == 0 || (excludedDays.@count > 0 && NONE excludedDays.day == %@))", today];
虽然这在开始时有效,但我刚刚发现这仅在 ExcludedDay 实体仅包含一天时有效。只要 ExcludedDay 实体包含多于一天的同一任务,此谓词就会停止工作。结果,即使一天在 ExcludedDay 实体中显示为一天,也选择了一天的任务,这当然是错误的。问题与作为 NSDate 对象的属性 day 无关:用相应的 NSString 或等效的整数替换 day,我仍然面临同样的问题和不正确的行为。
在这种情况下实现谓词的正确方法是什么?使用核心数据时,这可能是与 ANY 聚合运算符相关的错误吗? 提前谢谢你,这让我快疯了。
【问题讨论】: