多个NSPredicate

我试图在我的CoreData实体食谱中准备多个search。 有我想要准备提取的参数。

食谱属性:

@property (nonatomic, retain) NSNumber * difficulty; @property (nonatomic, retain) NSString * name; @property (nonatomic, retain) NSNumber * code; //like identifier @property (nonatomic, retain) NSNumber * prepTime; 

配料是一个独立的实体,配料清单。

join实体包含ingredientCoderecipeCodecount

getArrayOfJoinDataWithIngredients获取连接实体并返回包含一些input成分的配方代码的NSArray。

这是我的代码:

 - (IBAction)callRecipeFetch:(id)sender { NSString *predicateString = @""; NSArray *codes = [[NSArray alloc] init]; codes = nil; if ([paramController.ingredientsForSearchArray count] > 0) { NSMutableArray *ingredientsArray = [[NSMutableArray alloc] init]; for (Ingredients *ingredient in paramController.ingredientsForSearchArray) { [ingredientsArray addObject:ingredient.code]; } MainTabController *mainTabController = [[MainTabController alloc] init]; codes = [mainTabController getArrayOfJoinDataWithIngredients:ingredientsArray]; NSString *ingrSet = [NSString stringWithFormat:@"(code IN %@)", codes]; predicateString = [predicateString stringByAppendingString:ingrSet]; } NSString *diff; if ([predicateString isEqualToString:@""]) { diff = [NSString stringWithFormat:@"(difficulty <= %d)", paramController.diff.selectedSegmentIndex + 1]; } else diff = [NSString stringWithFormat:@" AND (difficulty <= %d)", paramController.diff.selectedSegmentIndex + 1]; predicateString = [predicateString stringByAppendingString:diff]; NSString *timeString = [NSString stringWithFormat:@" AND (%d =< prepTime) AND (prepTime <= %d)", paramController.rangeSlider.leftValue, paramController.rangeSlider.rightValue]; predicateString = [predicateString stringByAppendingString:timeString]; if (paramController.categoryCode) { NSString *categoryString = [NSString stringWithFormat:@" AND (inCategory = %@)", paramController.categoryCode]; predicateString = [predicateString stringByAppendingString:categoryString]; } NSPredicate *predicate = [NSPredicate predicateWithFormat: predicateString]; [resultController findRecipesWithPredicate:predicate]; } 

@"(code IN (\n 1,\n 3\n)) AND (difficulty <= 5) AND (0 =< prepTime) AND (prepTime <= 28800) AND (inCategory = 12)"

现在,当我使用代码准备NSPredicate时,在谓词部分(代码IN%@)中有一个错误:

 NSPredicate *predicate = [NSPredicate predicateWithFormat: predicateString]; 

错误:

 Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "(code IN ( 1, 3 )) AND (difficulty <= 5) AND (0 =< prepTime) AND (prepTime <= 28800) AND (inCategory = 12)"' 

如何用IN运算符正确地作谓词。 感谢所有的build议。

使用NSCompoundPredicate作为你的多谓词,你可以参考NSCompoundPredicate Class Reference

像这样的东西:

 NSPredicate * andPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:predicate1,predicate2,predicate3,nil]]; 

除了@ Joshua的回答,你也可以使用NSCompoundPredicate来处理你的OR操作。

Obj-C – 或

 // OR Condition // NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"X == 1"]; NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"X == 2"]; NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[predicate1, predicate2]]; 

Swift – 或者

 let predicate1:NSPredicate = NSPredicate(format: "X == 1") let predicate2:NSPredicate = NSPredicate(format: "Y == 2") let predicate:NSPredicate = NSCompoundPredicate(orPredicateWithSubpredicates: [predicate1,predicate2] ) 

Swift 3 – 或者

  let predicate1 = NSPredicate(format: "X == 1") let predicate2 = NSPredicate(format: "Y == 2") let predicateCompound = NSCompoundPredicate.init(type: .or, subpredicates: [predicate1,predicate2]) 

它会为你工作。

  NSPredicate *bPredicate; bPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@ OR product_price contains[c] %@ OR foodescription contains[c] %@",searchText,searchText,searchText]; NSArray *filteredArray = [getObjectsFromServiceArray filteredArrayUsingPredicate:bPredicate];