如何使用多约束配置NSPredicate

时间:2012-04-22 07:50:57

标签: objective-c core-data nspredicate

现在我有一个过滤器类,例如:

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

    BOOL aisset;
    BOOL bisset;
}

我有一个从核心数据中获取objs的函数,例如:

(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];
...

但如果我运行此代码,我将收到一个错误:'无法解析格式字符串“%@”'。

1 个答案:

答案 0 :(得分:2)

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

如果要合并这些条件,可以使用appendFormat

更新

您应该使用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