我有一个核心数据模型,其中任务实体包含与 ExcludedDay 实体的可选对多关系 ExcludedDays。 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 实体中显示为一天,也会选择某一天的任务,这当然是错误的。问题与属性 day 是一个 NSDate 对象无关:用相应的 NSString 或等效的整数替换 day,我仍然面临同样的问题和不正确的行为。
在这种情况下实现谓词的正确方法是什么?这可能是使用核心数据时与 ANY 聚合运算符相关的错误吗?
预先感谢您,这现在让我发疯。
事实证明,这是文档缺失和/或不一致的另一个问题。
在这种情况下,正确的谓词如下:
[NSPredicate predicateWithFormat:@"(excludedOccurrences.@count == 0) OR (0 == SUBQUERY(excludedOccurrences, $sub, $sub.day == %@).@count)", today]
在谓词中,子查询用于测试日期与您的测试日期匹配的相关 exceptedOccurrences 的数量是否等于 0。然而,该文档具有误导性。以下是《谓词编程指南》中关于将谓词与多对多关系结合使用的内容。
使用关系谓词
如果您使用一对多关系,谓词的构造会略有不同。例如,如果要获取其中至少一名员工的名字为“Matthew”的部门,则可以使用 ANY 运算符,如以下示例所示:
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"ANY employees.firstName like 'Matthew'"];
如果要查找所有员工的工资都超过特定金额的部门,可以使用 ALL 运算符,如下例所示:
float salary = ... ;
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"ALL employees.salary > %f", salary];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)