Как создать предикат запроса на выборку в swift, который не включает элементы с заданным атрибутом из связанной сущности - PullRequest
0 голосов
/ 16 июня 2020

У меня есть две сущности, связанные друг с другом. Первый - это объект транзакции, который имеет отношение «многие ко многим» с другим объектом с именем Tag. Таким образом, транзакция может иметь несколько тегов, а тег - несколько транзакций.

У меня есть метод, который извлекает данные из Core Data, который может возвращать результаты, помеченные заданным тегом. Я использовал такой предикат, как показано ниже:

fetchRequest.predicate = NSPredicate(format: "(%@ <= date) AND (date < %@) AND (ANY tags IN %@)", argumentArray: [startDate, endDate, tags])

Он отлично работает. Теперь я хочу создать еще один запрос на выборку с предикатом, который фильтрует результаты другим способом. Это должно возвращать результаты, которые НЕ имеют данного тега.

Итак, я попробовал следующий код:

fetchRequest.predicate = NSPredicate(format: "(%@ <= date) AND (date < %@) AND (tType == %@) AND (NOT ANY tags IN %@)", argumentArray: [startDate, endDate, type.rawValue, tags])

и

fetchRequest.predicate = NSPredicate(format: "(%@ <= date) AND (date < %@) AND (tType == %@) AND (NOT tags IN %@)", argumentArray: [startDate, endDate, type.rawValue, tags])

Но ни один из них не работает . Все, что он делает, это возвращает все элементы, независимо от того, помечены они или нет.

Я что-то здесь упускаю?

Любая помощь приветствуется. Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Для тех, кто сталкивается с той же проблемой, спасибо @MartinR за то, что указал мне правильное направление. Вот предикат, который я придумал и который сработал.

fetchRequest.predicate = NSPredicate(format: "(%@ <= date) AND (date < %@) AND (tType == %@) AND (SUBQUERY(tags, $t, $t IN %@).@count == 0)", argumentArray: [startDate, endDate, type.rawValue, exemptTag])

Итак, ключевым ингредиентом является SUBQUERY (tags, $ t, $ t IN% @). @ Count == 0, который просто ищет значения в excTag в свойстве tags запрашиваемого элемента.

0 голосов
/ 16 июня 2020

Вы пробовали это?

let format = "(%@ <= date) AND (date < %@) AND (tType == %@) AND (NOT (tags IN %@))"
let args = [startDate as NSDate, endDate as NSDate, type.rawValue, tags]
let predicate = NSPredicate(format: format, argumentArray: args)

Надеюсь, это сработает!

...