我還是相當新的使用NSPredicate,但我已經有了一個比較複雜的問題,我不知道如何去解決的最好辦法。爲NSPredicate過濾許多一對多,多對多關係
我試圖建立所謂的儀器的實體,它可以與許多程序中使用的過濾器。反過來,程序與一種或多種疾病有關。疾病與許多程序有關,儀器可以用於多個程序。換句話說,我有以下的許多一對多一對多的關係:
Instruments <-> Procedures <-> Diseases
我想要做的是使用Disease.title過濾儀器。在一個簡單而神奇的世界,這將是一樣簡單
//where predicate is used on the Instruments array
[NSPredicate predicateWithFormat:@"(procedures.diseases.title == %@)", diseaseTitleString];
通過這種逐件(有幾個錯別字和misnamings)步進,我發現,濾波器知道手術和疾病足以告訴領域我認爲「疾病類型」不是程序領域,「名稱」不是疾病領域。天真讓我希望這個簡單的謂詞能起作用。
我什麼也沒得到。
我也嘗試使用(ALL procedures.diseases.title == %@)
,但這並不能工作。
我已經看到了有關子謂詞,但沒有真正伸出我的一些作品或使得很多的意義,我一些事情。
基本上我想要得到的名單:
NSArray *instruments = [[NSArray alloc] init];
for (Disease *disease in Diseases) {
if ([disease.title isEqualToString:titleString]) {
for (Procedure *procedure in disease.procedures) {
for (Instrument *instrument in procedure.instruments) {
if (![instruments containsObject:instrument]) {
[instruments addObject:instrument];
}
}
}
}
}
現在,我使用這個方法來獲取我可以過濾基於其他謂詞的陣列,它的工作很好,但它的醜陋,我覺得有一個更好,更乾淨的方式來過濾這個。任何人都可以幫助教育我對NSPredicate設計的更精細的使用嗎?
這裏有一些很好的提示,但謂詞仍然返回一個空數組。我的其他子謂詞工作正常,但這個多多人仍然沒有工作,但應該相當於我上面代碼中的循環構建集合。 '[instrumentFilters addObject:[NSPredicate predicateWithFormat:@「ANY procedures.diseases.title =%@」,filterValue]];'然後我做一個和其他過濾器一樣正常工作的化合物。我錯過了什麼嗎? –
如果你沒有和化合物運行它會發生什麼? –
只用該謂詞運行篩選器(無複合)仍然不會返回任何結果。 :( –