2012-04-22 70 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