NSPredicate с несколькими параметрами - PullRequest
24 голосов
/ 08 июня 2011

Здравствуйте. Нужна помощь с предикатом. Проблема в том, что я хочу, чтобы одна функция, которая будет извлекать данные из базы данных, зависит от нескольких значений, которые она получает, но значения не всегда существуют, значит ли это, что мне нужно создавать несколько разных предикатов?

Код ниже

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"brand_id LIKE %@ AND brand_id LIKE %@ AND brand_id LIKE %@ AND brand_id LIKE %@ AND brand_id LIKE %@ AND item_category LIKE %@ AND item_make LIKE %@ AND item_gender LIKE %@ || item_price>%@ || item_price<%@",
                              brand_one, brand_two, brand_three, brand_four, brand_five, categoryString, makeString, genderString,[NSNumber numberWithInt:price_bottom],[NSNumber numberWithInt:price_top]];

brand_one, brand_two и т. Д. Иногда существуют, а иногда нет.

А как это должно быть для item_gender например. Давайте, если не указан пол, чем иметь их обоих.

Извините, если мое описание проблемы сбивает с толку.

Основываясь на комментариях Гобры, был получен следующий код

NSArray *brands = [NSArray arrayWithObjects:brand_one, brand_two, brand_three, brand_four, brand_five, nil];

    NSPredicate *predicate_brands = [NSPredicate predicateWithFormat:@"brand_id like %@" argumentArray:brands];

Логическое объяснение того, что функция поиска должна

  1. fetchrequest
  2. предикат при получении запроса

предикат, основанный на 5 идентификаторах бренда, идентификаторе товара, категории товара, марке товара, полу товара, если любое из вышеперечисленного является пустым, оно должно извлечь все связанные записи, например, если категория элемента пуста, оно должно извлечь все «Ювелирные изделия, часы и т. д.», но ограничить его остальными выражениями предиката.

Должен ли я создать, например, составные предикаты для брендов, а затем создать еще один для категории товаров со значениями "item_category like Jewellery" и "item_category like Watches" и после этого, как мне их точно объединить?

Ответы [ 3 ]

62 голосов
/ 08 июня 2011

Соберите соответствующую коллекцию отдельных предикатов в NSCompoundPredicate

, как в

NSMutableArray *parr = [NSMutableArray array];
if([brand_one length]) { 
    [parr addObject:[NSPredicate predicateWithFormat:@"brand_id LIKE %@",myBrandId]];
}
if([brand_two length]) { 
     // etc 
}

NSPredicate *compoundpred = [NSCompoundPredicate andPredicateWithSubpredicates:parr];

Вы можете сложить свои предикаты с orPredicateWithSubpredicates: и andPredicateWithSubpredicates:, а NSCompoundPredicate является NSPredicateсам может быть составлен.

См. https://developer.apple.com/documentation/foundation/nscompoundpredicate

2 голосов
/ 26 ноября 2015

Для тех, кто интересуется Swift!

let arrPred = [NSPredicate(format: "yourAttribute LIKE %@", toCompareID), NSPredicate(format: "yourAttribute2 LIKE %@", toCompareID2)] //Add as many predicates you want in short make your query

let compoundpred:NSPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: arrPred)
var arrFiltered = yourArray.filteredArrayUsingPredicate(compoundpred)
1 голос
/ 08 июня 2011

Динамически построить предикат довольно просто: объедините строку формата предиката с требуемым количеством условий и создайте соответствующий NSMutableArray с аргументами. [NSPredicate predicateWithFormat:argumentArray:] сделает все остальное.

...