Предикат составного соединения 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]
может использоваться для сравнения строк без учета регистра (так что текст поиска не нужно преобразовывать в нижний регистр)