Как создать предикат 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];
В качестве альтернативы вытащите подмножество с более простым предикатом и отфильтруйте их за пределами запроса на выборку. то есть.
- Задайте предикат для количества элементов в отношении, чтобы оно было таким же, как количество элементов в вашем наборе сравнения.
- Получить результаты
- Отфильтруйте эти результаты, чтобы показать только те, где наборы содержат одни и те же элементы.