2014-10-07 100 views
0

我被這個問題困住了一段時間,現在我似乎無法想出一個辦法讓它正確。我會盡我所能解釋清楚。複合謂詞不返回結果

我的核心數據模型中有3個實體。 工作場所,患者交接

enter image description here

一個職場可以有多個患者秒。另外患者可以屬於多個工作場所 s。

A 患者可以有一個交接,反之亦然。

在應用程序中,會向用戶顯示工作區列表。當用戶選擇一個工作場所時,我需要獲得一組屬於該工作場所的病人,並且有今天的移交。由於患者可以有多次切換,因此患者可能有重複記錄,這沒關係。

這就是我現在要做的。首先,我檢索所選用戶的Workplace對象。然後我遍歷它的患者並提取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()) 

這是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對象並獲取它的開始時間和結束時間,以得到一個日期框。我有他們在其他地方使用,他們的工作。 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 < ?)) 

任何人都可以告訴我,如果它的謂詞有問題嗎?或者如果有什麼不同的方法可以完全解決這個問題?我真的很感激它。

謝謝。

+1

多對多的關係被認爲是不好的設計,你正在解決你的問題,因爲你正在努力解決這個設計缺陷。考慮在WorkPlace和Patient之間引入Bridge實體,將您的M-M關係轉換爲兩個1對M的關係。然後,您可以放棄您已經完成的整個數組解決方案,並接近原始問題。 – DanK 2014-10-07 13:11:25

回答

1

使用對象圖,這看起來很簡單。儘量避免冗長的提取請求。

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)) 
+0

謝謝。我不知道對象圖查詢。 – Isuru 2014-10-12 16:40:58