【问题标题】:How to write an NSPredicate to search date attribute of to-many relationship?如何编写一个 NSPredicate 来搜索一对多关系的日期属性?
【发布时间】:2019-01-26 05:51:12
【问题描述】:

我有一个与“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 建议的方式执行它是否更有效,或者我的子查询谓词是否足够。

【问题讨论】:

    标签: swift core-data predicate


    【解决方案1】:

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

    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})
    

    【讨论】:

      猜你喜欢
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多