swift - 如何编写 NSPredicate 来搜索一对多关系的日期属性?

标签 swift core-data predicate

我有一个与“Act”对象(Patient.acts)具有一对多关系的“Patient”对象 Act 对象有一个 Date 类型的 startDate 属性

我正在尝试编写 NSPredicate 来获取所有至少有一项开始日期为今天的行为的患者

我使用的是 XCode 10,使用 swift 4.2

我无法找出正确的左侧表达式:

let start = NSExpression(forConstantValue: Calendar.current.startOfDay(for: Date()))
let end = NSExpression(forConstantValue: Calendar.current.endOfDay(for: Date()))
let todayRange = NSExpression(forAggregate: [start, end])
let actToday = NSComparisonPredicate(leftExpression: ????, rightExpression: todayRange, modifier: .any, type: .between, options: [])

对于 leftExpression,我尝试了多种选项,但没有任何效果:

let left = NSExpression(forConstantValue: "acts.startDate")

我尝试过子谓词方法:

let actDate = NSPredicate(format: "$x.startDate")
let left = NSExpression(forSubquery: NSExpression(forKeyPath: "acts"), usingIteratorVariable: "x", predicate: actDate2)

更新并回答

我想出了以下表达式:

let seenToday = NSPredicate(format: "SUBQUERY(acts, $v, $v.actStartDate => %@ && $v.actStartDate < %@).@count!=0", argumentArray:[startToday, endToday] )

感谢 vadian 的回答。我现在想知道的问题是,按照 vadian 提出的方式进行操作是否更有效,或者我的子查询谓词是否足够。

最佳答案

我建议获取给定日期的所有行为并将它们映射到其患者属性(假设行为中存在适当的反向关系)

let interval = Calendar.current.dateInterval(of: .day, for: Date())!
let fetchRequest : NSFetchRequest<Act> = Act.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "startDate BETWEEN %@", [interval.start, interval.end] as [CVarArg])

然后获取行为并将结果映射到一组患者

let acts = try context.fetch(fetchRequest)
let patients = Set(acts.map{$0.patient})

关于swift - 如何编写 NSPredicate 来搜索一对多关系的日期属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54376017/

相关文章:

java - 为什么 Java 8 的 Predicate<T> 不扩展 Function<T, Boolean>

swift - 找出哪个节点(与其他节点共享同一类别位掩码)与我的播放器节点发生碰撞 [Swift & Scenekit]

iphone - 当我使用 2 个 TableView 时,如何将数据(托管对象)从一个 TableView 移动到另一个 TableView ?

iOS - 初始加载大量数据

ios - 核心数据谓词的托管对象中的自定义方法

c++ - 我是否使用了 copy_if 错误?

java - 在 Lambda 表达式中组合谓词

swift - NSNotificationCenter 将结构作为 UserInfo 的一部分传递

xml - 快速完成处理程序

ios - 根据条件更改 CollectionView 中选定单元格的颜色