Как создать составной предикат в nsFetchRequest, который фильтрует по двум параметрам разных сущностей
Некоторая справочная информация о моей модели данных:
manufacturer <-->> item <<-->> tag
В настоящее время я генерирую список предметов по запросу извлечения:
- (NSFetchRequest*) rankingRequestForItem:(Item*)item {
NSFetchRequest* r = [NSFetchRequest fetchRequestWithEntityName:@"Item"];
NSPredicate* p = [NSPredicate predicateWithFormat:@"SELF != %@",item.objectID];
r.resultType = NSDictionaryResultType;
r.resultType = NSDictionaryResultType;
r.propertiesToFetch = @[[self objectIDExpressionDescription],@"itemName",
[self rankingExpressionDescriptionForTags:[item mutableSetValueForKey:@"itemToTag"]]];
r.predicate = p;
r.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"itemName" ascending:YES]];
return r;
}
Это создает список всех предметов. Я хочу отфильтровать его для элементов, которые имеют отношение к конкретному производителю. Поэтому я добавляю предикат после перечисления всех элементов и сортирует их по выбранному производителю.
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"itemToMa = %@", selectedManufacturer];
Это работает, но захватывает много элементов, которые будут отфильтрованы. Я предполагаю, что с большими наборами данных будет все медленнее и медленнее, поскольку он будет искать все элементы, а не только те, которые связаны с одним производителем. Я хочу, чтобы отфильтровать элементы в начальном методе RankingRequestForItem.
Можно ли переместить вышеуказанный предикат с верхним предикатом и создать составной предикат?
1 ответ
Я не стал бы беспокоиться о производительности. Core Data справляется с этим довольно хорошо. Иногда порядок предикатов имеет значение, так что, возможно, сначала поместите фильтр производителя.
Вы можете объединить предикаты в один, как это предлагается в комментарии к вашему вопросу, или использовать составные предикаты - результат практически одинаков.