NSPredicate multiple

J'essaye de préparer la search multiple dans mes recettes d'entité de CoreData. Il y a des parameters par lesquels je voudrais préparer le fetch.

Atsortingbuts de recettes :

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

Ingrédients est une entité distincte avec la list des ingrédients.

L' entité de jointure contient ingredientCode , recipeCode , count .

getArrayOfJoinDataWithIngredients récupère l'entité jointe et renvoie NSArray de codes de recettes contenant une partie de l'ingrédient input.

Voici mon code:

 - (IBAction)callRecipeFetch:(id)sender { NSSsortingng *predicateSsortingng = @""; 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]; NSSsortingng *ingrSet = [NSSsortingng ssortingngWithFormat:@"(code IN %@)", codes]; predicateSsortingng = [predicateSsortingng ssortingngByAppendingSsortingng:ingrSet]; } NSSsortingng *diff; if ([predicateSsortingng isEqualToSsortingng:@""]) { diff = [NSSsortingng ssortingngWithFormat:@"(difficulty <= %d)", paramController.diff.selectedSegmentIndex + 1]; } else diff = [NSSsortingng ssortingngWithFormat:@" AND (difficulty <= %d)", paramController.diff.selectedSegmentIndex + 1]; predicateSsortingng = [predicateSsortingng ssortingngByAppendingSsortingng:diff]; NSSsortingng *timeSsortingng = [NSSsortingng ssortingngWithFormat:@" AND (%d =< prepTime) AND (prepTime <= %d)", paramController.rangeSlider.leftValue, paramController.rangeSlider.rightValue]; predicateSsortingng = [predicateSsortingng ssortingngByAppendingSsortingng:timeSsortingng]; if (paramController.categoryCode) { NSSsortingng *categorySsortingng = [NSSsortingng ssortingngWithFormat:@" AND (inCategory = %@)", paramController.categoryCode]; predicateSsortingng = [predicateSsortingng ssortingngByAppendingSsortingng:categorySsortingng]; } NSPredicate *predicate = [NSPredicate predicateWithFormat: predicateSsortingng]; [resultController findRecipesWithPredicate:predicate]; } 

La string predicateSsortingng complète est @"(code IN (\n 1,\n 3\n)) AND (difficulty <= 5) AND (0 =< prepTime) AND (prepTime <= 28800) AND (inCategory = 12)"

Maintenant, j'ai une erreur dans la partie prédicat (code IN% @) lorsque je prépare NSPredicate avec du code:

 NSPredicate *predicate = [NSPredicate predicateWithFormat: predicateSsortingng]; 

ERREUR:

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

Comment faire correctement un prédicat avec l'opérateur IN . Merci pour tous les conseils.

utilisez NSCompoundPredicate pour vos prédicats multiples, vous pouvez vous référer à la reference de class NSCompoundPredicate

quelque chose comme ça:

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

Ajout à la réponse de @ Joshua, vous pouvez également utiliser NSCompoundPredicate pour vos opérations OU comme ceci.

Obj-C – OU

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

Swift – OU

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

Swift 3 – OU

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

Cela fonctionnera pour vous.

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