2012-04-22 94 views
0
配置NSPredicate

現在我有一個過濾器類,如:如何使用多約束

@interface Filter:NSObject { 
    NSString *a, 
    NSString *b; 

    BOOL aisset; 
    BOOL bisset; 
} 

,我有一個函數來獲得從核心數據OBJ文件,如:

(NSArray *)findObjs:(Filter *)filter; 

如何實現這個功能?對於這種情況,我知道答案:

... 
if (!aisset && !bisset) { 
} 
else if (aisset && !bisset) { 
    predicate = [NSPredicate predicateWithFormat:@"a==%@", a]; 
} 
else if (!aisset && bisset) { 
    predicate = [NSPredicate predicateWithFormat:@"b==%@", b]; 
} 
else if (aisset && bisset) { 
    predicate = [NSPredicate predicateWithFormat:@"a==%@ AND b==%@", a, b]; 
} 
... 

但是如何處理三個變量,例如a,b,c?

我也嘗試這種方式:

... 
NSString *predicateStr = @""; 
if (aisset) ... 
if (bisset) ... 
if (cisset) ... 
predicate = [NSPredicate predicateWithFormat:@"%@", predicateStr]; 
... 

,但如果我使用此代碼運行,我會得到一個錯誤:「無法解析格式字符串‘%@’」。

+0

爲什麼你將'BOOL's存儲爲指針? – 2012-04-22 07:57:35

+0

@Jenox我的錯誤,完成了! – 2012-04-22 08:05:24

回答

2

你可以使用predicate = [NSPredicate predicateWithFormat:@"%K == %@", predicateStr,valueToCheck];

如果土特產品螞蟻這些條件結合起來,你可以使用appendFormat

UPDATE

您應該使用NSCompoundPredicate。讓我們結合這些謂詞

NSMutableArray *subpredicates = [NSMutableArray array]; 

if (aisset) 
[subpredicates addObject:[NSPredicate predicateWithFormat:@"a==%@", a]]; 
if (bisset) 
[subpredicates addObject:[NSPredicate predicateWithFormat:@"b==%@", b]]; 
... 
NSPredicate *finished = [NSCompoundPredicate andPredicateWithSubpredicates:subpreds];//Your final predicate 
+0

感謝您的回答,「valueToCheck」的價值是什麼 – 2012-04-22 08:11:02

+0

這是您的a,b或c,它符合isset條件 – 2012-04-22 08:15:56

+0

如何使用appendFormat?我以前沒有看到它... – 2012-04-22 08:26:50