2012-05-23 4 views
1

У меня есть объект MyEntity, который имеет отношение к tags ко многим, так tags является NSSet из MyEntity. Это необязательно, поэтому некоторые MyEntity's не имеют tags. Вот то, что я пытаюсь сделать:NSPredicate в зависимости от содержания отношений

predicate= [NSPredicate predicateWithFormat: 
@"(rootId == parentId AND NONE tags.tagName == %@)", @"badTag"]; 

Так что я хочу, чтобы получить все MyEntitys где rootId == parentId и не дать мне сущности, если его теги имеют тег с именем "badTag". Проблема заключается в том, что если у объекта вообще нет каких-либо тегов, этот объект не возвращается. Я пробовал вариант выше:

@"(rootId == parentId AND ANY tags.tagName != %@)", @"badTag"]; 

Но это дает тот же результат. Как я могу сделать эту предикатную работу для случая, когда у объекта нет каких-либо тегов?

+0

Существуют ли сущности, которые не имеют тегов, имеют набор тегов, который равен нулю или вообще не установлен. – rdelmar

+0

Они должны иметь только значение по умолчанию. Они никогда не были установлены, и я никогда не подделывал их. – Snowman

+0

Я протестировал этот код, но с пользовательскими объектами, а не с основными объектами данных, и ваш первый предикат работал в этих условиях, при этом набор тегов был ниль (либо установлен в nil явно, либо просто не установлен). Я не знаю, почему это было бы иначе с сущностями. – rdelmar

ответ

1

Вы можете решить это с помощью подзапроса . Подзапросы чрезвычайно мощны, как только вы их освоите. К сожалению, они плохо документированы.

(rootId == parentId) AND (SUBQUERY(tag, $x, $x.tagName == %@).count() == 0) 
1

Возможно, добавив OR COUNT(tags) == 0, вы получите то, что хотите?

Если это хранилище SQL, попробуйте включить отладку CoreData SQL и посмотреть, что на самом деле выполняется. XCode4 and Core Data: How to enable SQL Debugging

Смежные вопросы