2013-05-20 7 views
15

私はCoreDataエンティティで複数の検索を準備しようとしていますレシピ。フェッチを準備するためのパラメータがあります。属性複数のNSPredicate

レシピ:

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

成分を食材のリストを持つ独立したエンティティです。

エンティティがingredientCoderecipeCodeが含まれて参加します。

getArrayOfJoinDataWithIngredientsエンティティを結合フェッチしコード入力成分の一部を含有するレシピののに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]; 
} 

フルpredicateStringが、私はコードでNSPredicateを準備するとき、今、私は述語部分(%の@のコード)でエラーが発生している@"(code IN (\n 1,\n 3\n)) AND (difficulty <= 5) AND (0 =< prepTime) AND (prepTime <= 28800) AND (inCategory = 12)"

です:

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オペレータ。すべてのアドバイスをありがとう。あなたの複数の述語のため

答えて