我在这个问题上停留了一段时间,似乎无法想出正确的方法。我会尽力解释清楚。

我的核心数据模型中有3个实体。工作场所,患者和移交。



一个工作场所可以有多个患者。患者也可以属于多个工作场所。

患者可以进行一次移交,反之亦然。

在应用程序中,向用户显示一个工作场所列表。当用户选择工作场所时,我需要获取一组属于该所选工作场所并具有今天移交功能的患者。由于患者可以有多个移交,因此可以有重复的患者记录,这样就可以了。

这就是我现在正在做的。首先,我为选定的用户检索Workplace对象。然后,对“ Patients”进行遍历,提取“ Patient”对象的ID,并将它们收集到一个数组中。然后,我传递患者ID和日期的数组,以过滤出具有给定日期移交的患者。

let workplace = db.loadWorkplace(155) // 155 is the ID of the Workplace

var patientIDs: [Int] = []
for p in workplace.patients {
    let patient = p as Patient
    patientIDs.append(patient.id)
}
handovers = db.loadHandovers(patientIDs, date: NSDate.date())


这是进行过滤的方法。

public func loadHandovers(patients: [Int], date: NSDate) -> [AnyObject] {

    let fetchRequest = NSFetchRequest()
    let entityDescription = NSEntityDescription.entityForName("Handover", inManagedObjectContext: managedObjectContext!)
    let patientPredicate = NSPredicate(format: "patient.id IN %@", patients)
    let datePredicate = NSPredicate(format: "date > %@ AND date < %@", getStartDate(date), getEndDate(date))

    let compoundPredicate = NSCompoundPredicate(type: .AndPredicateType, subpredicates: [patientPredicate, datePredicate])

    fetchRequest.entity = entityDescription
    fetchRequest.predicate = compoundPredicate

    var error: NSError?
    let result = managedObjectContext?.executeFetchRequest(fetchRequest, error: &error)
    return result!
}


getStartDate()getEndDate()方法转换NSDate对象并获取其开始时间和结束时间以获取日期框架。我在其他一些地方使用过它们,并且它们可以工作。 Here's有关它的详细说明。

无论如何,我的loadHandovers()方法返回0个结果。可能不是因为当我插入数据时,我可以看到今天的切换。下面是从核心数据执行的SQL查询。

SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZDATE, t0.ZSIGNEDBY, t0.ZSTATUS, t0.ZPATIENT
FROM ZHANDOVER t0
JOIN ZPATIENT t1 ON t0.ZPATIENT = t1.Z_PK
WHERE ( t1.ZID IN  (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
AND ( t0.ZDATE > ? AND  t0.ZDATE < ?))


谁能告诉我我的谓词是否有问题?还是有完全不同的方法来解决这个问题?我真的很感激。

谢谢。

最佳答案

使用对象图,这似乎非常简单。尝试避免冗长的获取请求。

workplace.patients.filteredSetUsingPredicate(
  NSPredicate(format: "handovers.date > %@ && handovers.date < %@",
              startOfDay, endOfDay))


您似乎对自己的设置感到困惑。如果患者只有一个Handover,为什么要用复数形式称为handovers关系?

矛盾的说法说明了您的设置的另一个缺陷


  “由于患者可以进行多次移交...”


在您的数据模型中,患者只能进行一次移交,而不是很多。唯一的解释是,您正为同一个患者维护多个Patient实例,仅因为该患者具有多个移交。当然,这是不合逻辑的,也是您困惑和遇到错误的部分原因。

更好的数据结构,避免重复患者:

Workplace <<---->> Patient <---->> Handover

这假定移交与医院无关。如果这样做,您应该使用Handover实体作为@DanK建议的一种联接表:

Workplace <---->> Handover <<----> Patient

如果这是您想要的,则谓词的应用将更短:

workplace.handovers.filteredSetUsingPredicate(
  NSPredicate(format: "date > %@ && date < %@", startOfDay, endOfDay))

关于ios - 复合谓词不返回结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26236416/

10-10 11:10