NSPredicate 用于检测子查询中的非空关系

2024-01-10

给定核心数据实体设置如下

  • Entity A
    • Bs -> B(多对多)
    • Cs -> C(多对多)
    • 孩子 -> 孩子(多对多)
  • Entity B
    • 孩子 -> 孩子(多对多)
  • Entity C
    • 孩子 -> 孩子(多对多)
  • Child
    • date

我想要查询实体 A,其中任何子实体(实体 A、B 或 C 中)的日期都通过某些查询,例如大于指定日期。

考虑到嵌套关系,需要一些嵌套子查询,因此要使用类似这样的方法检查 A 中的所有 B 子查询

predicateString += "(SUBQUERY(Bs, $b, SUBQUERY($b.children, $child, $child.date >= %@).@count > 0).@count > 0)"
predicateVars = [testDate! as NSDate]
let predicate = NSPredicate(format: predicateString, argumentArray: predicateVars)

对 C 重复相同形式的查询,然后对 A 的直接子级执行单个 SUBQUERY。

在对谓词形式进行一些微调(确保添加了所有所需的计数)后,这一切都工作正常。

当我现在想要执行类似的搜索时,出现了一个小问题,但我不想要求孩子的日期大于测试日期,而是只想查找在 A.children、Bs.children、Cs 中拥有任何孩子的所有 A。孩子们。

嵌套的 SUBQUERIES 引起了问题,起初我认为做一个单级 SUBQUERY 然后检查其中子级关系的计数就可以了,所以像这样

predicateString += " SUBQUERY(Bs, $b, $b.children.@count > 0).@count > 0"

它被接受为有效的谓词,但是当它被评估时,你遇到了异常

[error] error: exception handling request: <NSSQLFetchRequestContext: 0x60000018ec70> , Keypath containing KVC aggregate where there shouldn't be one; failed to handle $b.children.@count with userInfo of (null)

快速搜索堆栈溢出在这个问题中发现了同样的错误

Core Data SUBQUERY 和 NSFetchedResultsController 的键路径错误 https://stackoverflow.com/questions/10762539/keypath-error-with-core-data-subquery-and-nsfetchedresultscontroller

这似乎表明您不能在子查询中执行@count,因此必须对子查询执行另一个子查询才能获得相同的结果。这与上面的第一个示例的形式相同,尽管我需要在 SUBQUERY 中设置一个对于子级的每个元素始终成立的条件。我的第一个想法是希望我可以像这样使用 TRUE

predicateString += "(SUBQUERY(Bs, $b, SUBQUERY($b.children, $child, TRUE).@count > 0).@count > 0)"

感觉很浪费,但可以实现我想要的。不幸的是它无法解析为有效的谓词。

除此之外,我还成功地进行了始终正确的查询,因此将日期与 1970 年进行比较,如下所示

let date1970 = Date.init(timeIntervalSince1970: 0)
predicateString += "(SUBQUERY(Bs, $b, SUBQUERY($b.children, $child, $child.date >= %@).@count > 0).@count > 0)"
predicateVars = [date1970! as NSDate]

这是可行的,但感觉比我想要的只是计数要多做一些工作。一个更简单的有效示例也只是测试每个孩子是否为零,所以

predicateString += "(SUBQUERY(Bs, $b, SUBQUERY($b.children, $child, $child != nil).@count > 0).@count > 0)"
predicateVars = [testDate! as NSDate]

这看起来好多了,但我只是想知道是否有更好的选择。老实说,我不明白为什么 TRUE 条件本身不是一个有效的谓词。是的,它很浪费,但在这种情况下,我们似乎必须执行一个有效浪费的子查询来获得我们想要的计数。

有人有更好的想法吗?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSPredicate 用于检测子查询中的非空关系 的相关文章

  • 写入 Core Data 时创建新对象

    我有一个具有一些表单字段的应用程序 提交表单后 它将数据写入我的核心数据对象 但是 当再次提交表单时 它会覆盖现有数据而不是附加到它 这正是我想要发生的情况 guard let appDelegate UIApplication share
  • 复杂对象上的自定义 NSSortDescriptor

    这是我的第一篇文章 如果我可能不尊重所有惯例 我很抱歉 尽管我会尽力而为 我以前总是在 SO 上找到解决我的问题的方法 但我完全陷入了一个相当复杂的可可问题 我正在尝试对 CoreData 对象列表进行复杂的排序 我有一个由 Book 对象
  • iPhone |从头开始构建新版本的核心数据迁移

    我正在开发应用程序更新 这个版本完全是从头开始构建的 并且具有全新的功能coreData模型架构 我需要写coreData从旧模型迁移 我一直在寻找资源来写作coreData迁移但都需要旧模型文件 由于这个版本是全新的 所以我没有旧的模型架
  • 强制设置核心数据检查点?

    我编写了一个通过 Core Data 搅动大量数据的应用程序 用户在后台退出应用程序后 我会清理这些数据 由于 WAL 检查点似乎是导致 UI 暂停的主要原因 因此我还想强制使用 WAL 检查点 是的 我知道创建第二个核心数据堆栈 这也将完
  • NSFetchedResultsController 在 VIPER 架构中的位置是什么?

    In VIPER https www objc io issues 13 architecture viper 与MVC不同的是 NSFetchedResultsController的角色和地点没有那么明确的定义 把它放在交互器上合适吗 根
  • NSFetchedResultsController XCode 7 问题

    Xcode 7 beta 6 和 NSFetchedResultsController 今天让我头疼 如果我使用 Xcode 6 编译相同的代码 使用 Swift 2 修复 程序可以在设备和模拟器 iOS 7 iOS8 上运行 但是 如果我
  • 循环核心数据 NSSet 的正确语法

    每当我循环遍历核心数据关系 NSSet 时 我必须将集合转换为数组 for student in classroom students allObjects as Student print student name 或者我可以正常循环遍历
  • 如何保证主机应用程序和扩展程序使用的共享应用程序容器中的核心数据存储中的唯一条目?

    为了有效地提出我的问题 让我们首先考虑一下我面临的具体场景 常规设置 一个主机 iOS 8 应用程序 与主机应用程序捆绑在一起的一个或多个 iOS 8 扩展 WatchKit Share 等 主机应用程序和所有扩展在共享应用程序组容器中共享
  • 使用新数据快速更新 UITableView

    我正在尝试重新填充我的UITableView来自另一个 JSON 调用的数据 然而 我当前的设置似乎不起作用 虽然有很多相同的问题 但我可以找到我已经尝试过的答案 我将 API 数据保存在CoreData实体对象 我用我的 UITableV
  • 轻量级核心数据迁移后,如何为现有实体的新属性设置默认值?

    我已经成功完成了核心数据模型的轻量级迁移 我的自定义实体 Vehicle 收到了一个新属性 tirePressure 它是 double 类型的可选属性 默认值为 0 00 当从商店中获取 旧 车辆 在迁移发生之前创建的车辆 时 其 tir
  • 如何在核心数据中保存通用测量<单位>?

    如何在核心数据中保存和检索通用测量 我想做的是保存Measurement
  • 如何判断“NSManagedObject”是否已被删除?

    我有一个NSManagedObject已被删除 并且包含该托管对象的上下文已被保存 我明白那个isDeleted回报YESif Core Data 将要求持久存储在下一次保存操作期间删除该对象 然而 由于保存已经发生 isDeleted回报
  • 使用“对多”关系从 NSFetchedResultsController 派生 UITableView 部分

    我的核心数据模型如下所示 article lt gt gt category 是否可以远程使用NSFetchedResultsController生成一个看起来像这样的 UITableView Category 1 Article A Ar
  • 如何在核心数据中应用group by子句

    我正在实现 tableview 我想在 tableview 部分显示类名 并且我正在尝试获取 使用核心数据实现的数据库中的类值 我想使用类名上的 group by 子句获取数据 这是我的代码 AppDelegate appDelegate
  • Coredata错误setObjectForKey:对象不能为nil

    我正在尝试检查我的核心数据存储中是否有任何数据作为我的应用程序的恢复类型 基本上 如果用户处于最终视图 则 coredata 中会有一些数据不断更新 因此 他们处于最终视图中 然后应用程序崩溃 或者他们将其置于睡眠状态 然后应用程序从内存中
  • 可以使用两个独立的 SQLite 数据库吗?

    我有一个 sqlite 数据库 其中存储用户定义的信息和用户只读的信息 我觉得将来可能需要修改只读信息 并且我不想进行整个数据迁移 有没有一种方法可以使用单独的 sqlite 数据库来存储只读信息 该数据库可以轻松替换 如果是这样 您能否就
  • Excel 工作表到 iPhone 数据 -- A 点到 B 点

    尽可能简单 我有一个非常简单的 Excel 电子表格 只有 1000 多条记录 我想将其用作 iPhone 应用程序的静态数据源 最好的进攻计划是什么 我心中的可能性 1 直接读取XLS作为数据源 是否有Obj C库用于此 2 将XLS 转
  • 在视图之间传递核心数据实体变量

    我无法理解如何在视图之间使用核心数据实体变量 为了更好地理解我的问题是什么 我的代码如下 View A 基本上 您必须将完整预算实体或相关预算实体的 ID 从视图 A 传递到视图 B 由于不知道您的应用程序的视图层次结构和逻辑 我假设您选择
  • 现有的和未输入错误的密钥的 NSUnknownKeyException

    我得到以下输出 Terminating app due to uncaught exception NSUnknownKeyException reason
  • 带有 Core Data 对象的动态 UITableView 高度

    过去几天我一直在试图解决一个谜团 即为什么我的批处理大小为 20 的 NSFetchedResultsController 总是在获取完成后立即错误 即加载到内存中 我的所有对象 从而导致请求需要约 20 秒 事实证明 这是因为在我的 he

随机推荐