我在这个问题上停留了一段时间,似乎无法想出正确的方法。我会尽力解释清楚。
我的核心数据模型中有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/