Как создать предикат Core Data для проверки того, что отношение содержит все данные объекты?

Настройка:

У меня есть объект Core Data A, который имеет отношение to-many к B. Назовите отношение "items". Таким образом, a.items возвращает все B-s, связанные с A.

Теперь у меня есть ручной набор NSSet "itemSet" объектов B.

Я хочу сделать следующее:

return all A objects whose "items" relation exactly matches itemSet

Как мне построить предикат? Ive пробовал это:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          @"(ALL items in %@)", itemSet];

Но это просто дает мне Unsupported predicate (null).

Это:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          @"(items in %@)", itemSet];

говорит мне unimplemented SQL generation for predicate. Интересно, но не полезно.

Итак, каков правильный способ фильтрации отношения с набором?

Ответ 1

Можно использовать следующий предикат:

[NSPredicate predicateWithFormat:@"([email protected] == %d) AND (SUBQUERY(items, $x, $x IN %@)[email protected] == %d)",
                      itemSet.count, itemSet, itemSet.count];

Предикат сначала проверяет, что количество элементов равно размеру данного itemSet, а затем проверяет, что количество элементов, которые являются членами itemSet, также равно размеру itemSet. Если оба значения true, то items должно быть равно itemSet.

Ответ 2

Вы пробовали:

NSPredicate *predicate = [NSPredicate predicateWithFormate:@"items == %@", itemSet];

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

  • Задайте предикат для количества элементов в отношении, чтобы оно было таким же, как количество элементов в вашем наборе сравнения.
  • Получить результаты
  • Отфильтруйте эти результаты, чтобы показать только те, где наборы содержат одни и те же элементы.