Ios 不返回结果的复合谓词
我被这个问题困扰了一段时间,现在我似乎想不出一个正确的方法。我会尽量解释清楚的 我的核心数据模型中有3个实体工作场所、患者和交接 一个工作场所可以有多个患者。同样,一名患者可以属于多个工作场所 患者可以进行一次交接,反之亦然 在应用程序中,会向用户显示工作场所列表。当用户选择一个工作场所时,我需要获得一组患者,他们属于所选工作场所,并且有今天的讲义。因为一个病人可以有多个交接,病人可以有重复的记录,这没关系 这就是我现在正在做的。首先,我检索所选用户的Workplace对象。然后我遍历它的病人,提取病人对象的ID,并将它们收集到一个数组中。然后,我传递患者ID数组和日期,以筛选出在给定日期进行交接的患者Ios 不返回结果的复合谓词,ios,sql,core-data,nsfetchrequest,nscompoundpredicate,Ios,Sql,Core Data,Nsfetchrequest,Nscompoundpredicate,我被这个问题困扰了一段时间,现在我似乎想不出一个正确的方法。我会尽量解释清楚的 我的核心数据模型中有3个实体工作场所、患者和交接 一个工作场所可以有多个患者。同样,一名患者可以属于多个工作场所 患者可以进行一次交接,反之亦然 在应用程序中,会向用户显示工作场所列表。当用户选择一个工作场所时,我需要获得一组患者,他们属于所选工作场所,并且有今天的讲义。因为一个病人可以有多个交接,病人可以有重复的记录,这没关系 这就是我现在正在做的。首先,我检索所选用户的Workplace对象。然后我遍历它的病人
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!
}
谁能告诉我我的谓词是否有问题吗?或者如果有不同的方法来处理这个问题?我真的很感激
多谢各位 使用对象图,这看起来非常简单。尽量避免冗长的获取请求
workplace.patients.filteredSetUsingPredicate(
NSPredicate(format: "handovers.date > %@ && handovers.date < %@",
startOfDay, endOfDay))
多对多关系被认为是糟糕的设计,而您正遇到问题,因为您正试图解决此设计缺陷。考虑在工作场所和患者之间引入一个桥梁实体,将您的M-M关系转变为两个1对M关系。然后,您可以放弃现有的整个阵列解决方案,直接解决原始问题。谢谢。我不知道对象图查询。
workplace.patients.filteredSetUsingPredicate(
NSPredicate(format: "handovers.date > %@ && handovers.date < %@",
startOfDay, endOfDay))
workplace.handovers.filteredSetUsingPredicate(
NSPredicate(format: "date > %@ && date < %@", startOfDay, endOfDay))