2011-09-29 186 views
3

我還是相當新的使用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設計的更精細的使用嗎?

回答

2

在你上面的謂詞,用一個等於更換雙等號。還要添加一個「ANY」子句。最後,刪除括號。所以你將有:

[NSPredicate predicateWithFormat:@"ANY procedures.diseases.title = %@", diseaseTitleString]; 

一般來說,我覺得處理複雜謂詞的一個好方法是使用子謂詞來構建它們。

所以,你開始:

 NSMutableArray *subpredicates = [NSMutableArray array]; 

然後一點一點添加您的subpredicates:

[subpredicates addObject: 
    [NSPredicate predicateWithFormat:@"ANY procedures.diseases.title = %@", 
     diseaseTitleString]] 

[subpredicates addObject:anotherPredicate etc]; 

最後,創建你的 「和」 或 「或」 謂詞,例如:

NSPredicate *andPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates]; 
+0

這裏有一些很好的提示,但謂詞仍然返回一個空數組。我的其他子謂詞工作正常,但這個多多人仍然沒有工作,但應該相當於我上面代碼中的循環構建集合。 '[instrumentFilters addObject:[NSPredicate predicateWithFormat:@「ANY procedures.diseases.title =%@」,filterValue]];'然後我做一個和其他過濾器一樣正常工作的化合物。我錯過了什麼嗎? –

+0

如果你沒有和化合物運行它會發生什麼? –

+0

只用該謂詞運行篩選器(無複合)仍然不會返回任何結果。 :( –