17

CoreData エンティティRecipesで複数の検索を準備しようとしています。フェッチを準備したいパラメータがあります。

レシピの属性:

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

Ingredientsは、成分のリストを持つ別のエンティティです。

結合エンティティには、materialsCode 、 recipCode count含まれます。

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 は@"(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演算子で正しく述語を作る方法。すべてのアドバイスをありがとう。

4

3 に答える 3

41

NSCompoundPredicate複数の述語に使用するには、 NSCompoundPredicate クラス リファレンスを参照できます。

このようなもの:

NSPredicate * andPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:predicate1,predicate2,predicate3,nil]];
于 2013-05-20T05:11:55.397 に答える
13

@Joshua の回答に加えて、このような OR 操作に NSCompoundPredicate を使用することもできます。

オブジェクト C - または

// OR Condition //

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

スウィフト - または

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

スウィフト 3 - または

    let predicate1 = NSPredicate(format: "X == 1")
    let predicate2 = NSPredicate(format: "Y == 2")
    let predicateCompound = NSCompoundPredicate.init(type: .or, subpredicates: [predicate1,predicate2])
于 2015-12-10T23:17:46.397 に答える
0

それはあなたのために働くでしょう。

    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];
于 2016-08-25T10:18:10.573 に答える