Что вам нужно сделать, это создать предикат для каждого из ваших предложений. Например, давайте разберем ваш запрос:
- ВЫБРАТЬ * ИЗ СДЕЛКИ
- ГДЕ КАТЕГОРИЯ В (список категорий)
- И РАСПОЛОЖЕНИЕ В (locationList)
- И TYPE IN (typeList)
- И NOTE содержит [cd] «некоторый текст»
- AND DATE> = fromDate AND DATE <+ toDate </li>
Исходя из этого, у вас есть 5 предикатов (2-6). Так что давайте работать над ними один за другим.
NSPredicate *inCategoryPredicate = [NSPredicate predicateWithFormat:@"Category IN %@", categoryList];
NSPredicate *locationPredicate = [NSPredicate predicateWithFormat:@"Location IN %@", locationList];
NSPredicate *typePredicate = [NSPredicate predicateWithFormat:@"Type IN %@", typeList];
NSPredicate *notePredicate = [NSPredicate predicateWithFormat:@"Note contains[c] %@", @"Some Text"];
NSPredicate *startDatePredicate = [NSPredicate predicateWithFormat:@"Date => @", fromDate];
NSPredicate *endDatePredicate = [NSPredicate predicateWithFormat:@"Date <= @", toDate];
Теперь вам просто нужно объединить их в один предикат: Документация Apple гласит :
Вы должны структурировать составные предикаты, чтобы минимизировать количество
работа сделана. В частности, сопоставление регулярных выражений является дорогостоящим
операция. Поэтому в составном предикате вы должны выполнить
простые тесты перед регулярным выражением;
Как говорится, тогда вы должны сначала начать с "простых" предикатов. Итак:
NSCompoundPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects: startDatePredicate, endDatePredicate, inCategoryPredicate, locationPredicate, typePredicate, notePredicate];
Вы всегда можете получить представление о том, как выглядит предикат (sql where), если вы NSLog его.