iOS Swift 复合谓词

iOS Swift Compound Predicate

我正在尝试搜索核心数据中的特定项目

我有一个实体颜色,它有一个 NSSet ProjectColour 实体。 ProjectColour 实体有一个名为 project 的字段,它是一个项目实体,还有两个名为 fullLeft 和 partialLeft 的 int 字段。这有一个名为 drillType 的字段,它是一个字符串。

我正在尝试所有 drillType 为 Square 且 fullLeft 和 partialLeft > 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])
}

这在搜索类型为圆形但使用正方形时有效,它 return 搜索了错误的对象 IE。 两个对象,一个是正方形,但部分和全部都等于 0 第二个是部分等于 1

的 Round

例子 3 个颜色对象

3 个项目颜色对象

在搜索时,我得到了方形,我得到了所有 3 个结果 return,即使第二个项目颜色对象是圆形

在搜索文本时,我想要 Square 的所有 ProjectColour.project.drillType 和 ProjectColour.fullLeft > 0 AND 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

但是当我尝试将两者结合起来时它不起作用

假设您要搜索具有 一些 相关 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] 可用于 case-insensitive 字符串比较(以便搜索文本不需要转换为小写)