0

我被这个问题困扰了一段时间,现在我似乎想不出一种方法来解决这个问题。我会尽量解释清楚。

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

在此处输入图像描述

一个Workplace可以有多个Patient。一个Patient也可以属于多个Workplace

患者可以进行一次切换反之亦然。

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

这就是我现在正在做的事情。首先,我检索所选用户的 Workplace 对象。然后我遍历它的患者并提取患者对象的 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())

这是des过滤的方法。

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

无论如何,我的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 < ?)) 

谁能告诉我我的谓词是否有问题?或者如果有不同的方法可以完全解决这个问题?我真的很感激。

谢谢你。

4

1 回答 1

2

使用对象图,这看起来很简单。尽量避免冗长的获取请求。

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))
于 2014-10-07T22:44:06.043 回答