Подтвердить что ты не робот

NSPredicate с несколькими параметрами

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

Код ниже

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. Пусть, если не указано ни одного пола, как иметь их обоих.

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

База на комментариях Gobras создала следующий код

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

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

  • fetchrequest
  • предикат по запросу выборки
предикат

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

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

4b9b3361

Ответ 1

Соберите соответствующий набор индивидуальных предикатов в 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

Для тех, кто заинтересован в 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)

Ответ 3

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