Предикат составного соединения iOS

Я пытаюсь выполнить поиск определенных элементов в Core Data

У меня есть цвет объекта, который имеет NSSet объектов ProjectColour. У сущностей ProjectColour есть поле с именем project, которое является сущностью Project, и два целых поля с именами fullLeft и partalLeft. У этого есть поле с именем drillType, которое является строкой.

Я пытаюсь все объекты, которые имеют DrillType Square и как fullLeft, так и partLeft > 0

я пробовал

if searchedText.lowercased() == "square" {
    let predicateNumbers = NSPredicate(format: "ANY projectColours.fullLeft > 0 OR ANY projectColours.partialLeft > 0")
    let predicateDrillType = NSPredicate(format: "ANY projectColours.project.drillType == 'Square'")

    fetchRequest.predicate = NSCompoundPredicate(type: .and, subpredicates: [predicateNumbers, predicateDrillType])
}

Это работает при поиске Раунда как типа, но с квадратами, при этом возвращаются неправильные объекты, т.е. два объекта, один из которых является квадратом, но частичным и полным, равны 0, Второй - это Раунд, у которого частичный равен 1

Пример 3 Цветные объекты

  • 1
  • 2
  • 3

3 цветовых объекта проекта

  • Первый. Цвет (связанный с цветом) = 1, Полный = 1, Частичный = 1, Проект (связанный с сущностью проекта) - Тип сверления = Квадрат
  • Второй. Цвет = 2, Полный = 1, Частичный = 1, Проект (связанный с сущностью проекта) - Тип сверления = Круглый
  • Третий. Цвет (связанный с цветом) = 1, Полный = 0, Частичный = 0, Проект (связанный с сущностью проекта) - Тип сверления = Квадрат

При поиске, я получаю за квадрат, я получаю все 3 результата возврата, даже через второй объект Цвет проекта является Круглый

При поиске текста я хочу, чтобы все ProjectColour.project.drillType of Square и ProjectColour.fullLeft > 0 И ProjectColour.partialLeft > 0

fetchRequest.predicate = NSPredicate(format: "ANY projectColours.project.drillType == 'Square'") - Works

fetchRequest.predicate = NSPredicate(format: "ANY projectColours.fullLeft > 0 OR ANY projectColours.partialLeft > 0") - Works

Но когда я пытаюсь объединить два, это не работает

1 ответ

Решение

Предполагая, что вы хотите найти все объекты Color, которые имеют некоторый связанный объект ProjectColour с заданным project.drillType и положительный fullLeft и положительный partialLeft: Для такой просьбы вам нужна SUBQUERY. Что-то вроде (не проверено):

let pred = NSPredicate(format: """
    SUBQUERY(projectColours, $pc, $pc.fullLeft > 0
                                    AND $pc.partialLeft > 0
                                    AND $pc.project.drillType ==[c] %@
            ).@count > 0
""", searchedText)

Обратите внимание, что подстановка ключевых слов %@ предпочтительнее строковых литералов внутри строки формата предиката, и это ==[c] может использоваться для сравнения строк без учета регистра (так что текст поиска не нужно преобразовывать в нижний регистр)

Другие вопросы по тегам