Как создать предикат Core Data для проверки того, что отношение содержит все заданные объекты?
настройка:
у меня есть основной объект данных A, который имеет отношение ко многим к B. вызовите отношение "элементы". Итак, А. items возвращает все B-s, связанные с A.
теперь у меня есть вручную составленный nsset "itemSet" из B объектов.
Я хочу сделать следующее:
return all A objects whose "items" relation exactly matches itemSet
как построить предикат для этого? Я пробовал это:
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"(ALL items in %@)", itemSet];
но это просто дает мне Unsupported predicate (null)
.
Это:
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"(items in %@)", itemSet];
говорит мне unimplemented SQL generation for predicate
. Интересно, но не полезно.
Итак, каков правильный способ фильтрации отношения с набором?
2 ответов
может работать следующий предикат:
[NSPredicate predicateWithFormat:@"(items.@count == %d) AND (SUBQUERY(items, $x, $x IN %@).@count == %d)",
itemSet.count, itemSet, itemSet.count];
предикат сначала проверяет, что количество элементов равно размеру данного itemSet
, а затем проверяет, что число элементов, которые являются членами itemSet
также равно размеру itemSet
. Если оба истинны, то items
должно быть равно itemSet
.
вы пробовали:
NSPredicate *predicate = [NSPredicate predicateWithFormate:@"items == %@", itemSet];
альтернативно, вытащите подмножество с более простым предикатом и отфильтруйте их вне запроса выборки. т. е.
- установите предикат для количества элементов в связи, чтобы быть таким же, как количество элементов в наборе сравнения.
- получить результаты
- фильтровать эти результаты, чтобы показать только те, где наборы содержат те же элементы.