2013-05-20 26 views
15

Tôi đang cố gắng chuẩn bị nhiều tìm kiếm trong thực thể CoreData của mình Công thức. Có những thông số mà tôi muốn chuẩn bị tìm nạp.Nhiều NSPredicate

Công thức thuộc tính:

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

Thành phần là một thực thể riêng biệt với danh sách các thành phần.

Tham thực thể chứa ingredientCode, recipeCode, đếm.

getArrayOfJoinDataWithIngredients lấy về tham gia thực thể và trả NSArray của công thức nấu ăn, trong đó có một số thành phần đầu vào.

Đây là mã của tôi:

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

Các predicateString đầy đủ là @"(code IN (\n 1,\n 3\n)) AND (difficulty <= 5) AND (0 =< prepTime) AND (prepTime <= 28800) AND (inCategory = 12)"

Bây giờ tôi có một lỗi trong ngữ phần (mã TRÊN% @) khi tôi chuẩn bị NSPredicate với mã:

NSPredicate *predicate = [NSPredicate predicateWithFormat: predicateString]; 

L ERI:

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)"' 

Cách đặt chính xác vị từ bằng toán tử IN. Cảm ơn tất cả lời khuyên.

Trả lời

39

sử dụng NSCompoundPredicate cho nhiều vị của bạn, bạn có thể tham khảo NSCompoundPredicate Class Reference

một cái gì đó như thế này:

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

@Romowski hey dude đã cập nhật câu trả lời của tôi và đặt ví dụ – Joshua

+0

Cảm ơn! Nó hoạt động !!! – Romowski

+0

Không có vấn đề gì.vui vì nó đã giúp :) – Joshua

12

bổ sung @ câu trả lời của Giô-suê, bạn cũng có thể sử dụng cho các hoạt động của bạn NSCompoundPredicate HOẶC như thế này.

obj-C - HOẶC

// OR Condition // 

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

Swift - HOẶC

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

Swift 3 - HOẶC

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

Đẹp, Điều này được sử dụng đầy đủ cho tôi .. –

0

Nó sẽ làm việc cho bạn.

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]; 
Các vấn đề liên quan