Как создать предикат 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];

альтернативно, вытащите подмножество с более простым предикатом и отфильтруйте их вне запроса выборки. т. е.

  1. установите предикат для количества элементов в связи, чтобы быть таким же, как количество элементов в наборе сравнения.
  2. получить результаты
  3. фильтровать эти результаты, чтобы показать только те, где наборы содержат те же элементы.