使用 Core Data 时如何正确设置 NSPredicate 来实现一对多关系?

2024-01-12

我有一个核心数据模型,其中任务实体包含与 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(使用前将#替换为@)

使用 Core Data 时如何正确设置 NSPredicate 来实现一对多关系? 的相关文章

随机推荐

  • Tensorflow:无法创建会话

    当我运行我的代码时出现错误 错误是 tensorflow python framework errors impl InternalError 无法创建会话 这是我的代码 coding utf 8 import import checkpo
  • 如何放松到 SwiftUI 中的 MainView

    我找不到从 ViewB 转到 ContentView 而不显示第二个的方法NavigationView在另一个之上NavigationView struct ContentView View var body some View Navig
  • 数据表中的 masterCheckbox

    我正在尝试将 masterCheckbox 添加到 webix 数据表项目中 现在 我得到以下行为 当我单击主复选框时 值重写为 1 或 0 id title checkValue on uncheckValue off template
  • 如何在 Node Express 应用程序中传递对象?

    我正在使用express和node postgres构建一个节点应用程序 https github com brianc node postgres https github com brianc node postgres 我只想构建一次
  • 如何使用订阅者选项?

    我现在开始使用 Pubsubhubbub 以及所有关于实时的东西 但我在使用订阅者选项时遇到了问题 我正在尝试用 PHP 开发一个网络应用程序 订阅 RSS 之前发布的 到 Hub http pubsubhubbub appspot com
  • object() == object() 保证为 False 吗?

    假设我创建了两个类的实例object 这两个实例是否保证彼此不相等 换句话说 就是object object 保证是False 还是依赖于实现 我明白那个object is object 保证是False 但我在这里问的是object ob
  • K-means 仅使用特定数据帧列与 scikit-learn

    我正在使用k means算法从scikit learn库 我想要聚类的值位于具有 3 列的 pandas 数据框中 ID value 1 and value 2 我想使用以下方法对信息进行聚类value 1 and value 2 但我也想
  • 如何在 16 位 x86 实模式下通过 BIOS 访问 USB 端口?

    我是装配世界的新手 我正在尝试编写一些汇编代码来与串行 并行 VGA 键盘等硬件设备进行通信 我在 x86 intel 处理器的实模式下执行此操作 通过从我亲自编写的用于加载汇编代码的 boostrap 启动我的代码 嗯 根据我从阅读教程中
  • std::string::c_str 和 std::string::data 之间有什么区别? [复制]

    这个问题在这里已经有答案了 为什么我想打电话std string data http www cppreference com wiki string data over std string c str http www cpprefer
  • 在 OS X 中安装 Mono Framework 的正确方法

    在已经安装了旧版本 例如 2 10 4 的情况下 是否有正确的方法来安装新版本的 Mono 例如 2 10 5 可以遵循哪条路 卸载旧版本 然后安装新版本 用新版本覆盖旧版本 先感谢您 只需安装即可 不用担心 框架支持多个版本 您最终将获得
  • React JS 在另一个组件中引用函数

    我试图获取通过另一个组件呈现的按钮来引用和 或影响不同组件的状态 var Inputs React createClass getInitialState function return count 1 add function this
  • 将 Facebook 登录添加到 ionic 应用程序

    我也是 Angular 和 Ionic 的新手 尝试了以下教程 https www sitepoint com how to integrate facebook login into a cordova based app https w
  • 调用静态方法的实例

    再会 我有点困惑 我想使用日历 所以我在互联网上搜索它并遇到以下代码 Ca1endar c Calendar getlnstance c set 2011 2 5 1 25 但我了解到这是一个静态方法 Calendar getlnstanc
  • NPOI 数据格式

    我正在使用 NPOI v1 2 3 导出网格 但在使单元格格式正常工作时遇到问题 我有一个类将对象列表导出到 XLS 文件 为每个对象创建一行 并为每个配置的属性添加一个单元格 可以在每个属性级别设置单元格数据格式 我读过您不应该为每个单元
  • Clojure 环包装重新加载不起作用

    这是我的 core clj 文件 ns lein app core require compojure core refer all compojure route as route ring middleware reload refer
  • 在 mac osx leopard/snow leopard 中获取鼠标光标下的文本

    有什么想法可以让文本位于鼠标光标下吗 我正在尝试构建一个字典应用程序 当鼠标悬停在单词上时会弹出一个翻译面板 我查看了可访问性API 它只能找到当前的ui元素 但不能找到当前的单词 我最后的选择是经常截图 然后进行ocr 这会消耗CPU 我
  • 如何设置内存存储库

    我有以下课程 public class InMemoryRepository IRepository public void Add object entity throw new NotImplementedException publi
  • 使用 GitHub 页面,空白屏幕

    我正在尝试使用 username github io 在 github 页面上创建一个 React 项目 但是当我打开链接时 它只返回一个白屏 没有任何错误消息 当我使用自定义域名时也会发生这种情况 但是 当我在本地运行它以及使用 gh p
  • iOS:我可以检测设备屏幕是否打开/关闭吗?

    如何在 iOS 中检查屏幕是打开还是关闭 我想知道屏幕当前是否打开 即使我的应用程序在后台 我想要一个事件侦听器 谢谢 In Swift 3你可以做 override func viewDidLoad super viewDidLoad O
  • 使用 Core Data 时如何正确设置 NSPredicate 来实现一对多关系?

    我有一个核心数据模型 其中任务实体包含与 ExcludedDay 实体的可选对多关系 ExcludedDays ExcludedDay 的属性之一是 day 它是一个 NSDate 对象 ExcludedDay 实体与 Task 实体具有反