iOS Swift复合谓词

时间:2019-06-09 17:07:30

标签: ios swift nscompoundpredicate

我正在尝试在Core Data中搜索特定项目

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

我正在尝试所有具有rillType为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])
}

这在搜索Round作为类型但带有正方形时有效,它返回错误的对象 即 两个对象,一个是正方形,但部分和全部等于0 第二个是部分等于1的回合

示例 3种颜色对象

  • 1
  • 2
  • 3

3个项目颜色对象

  • 第一名。颜色(链接到颜色)= 1,完整= 1,部分= 1,项目(链接到项目实体)-钻头类型=正方形
  • 第二。颜色= 2,完整= 1,部分= 1,项目(链接到项目实体)-钻头类型=圆形
  • 第三。颜色(链接到颜色)= 1,完整= 0,部分= 0,项目(链接到项目实体)-钻头类型=方格

搜索时,我得到正方形,即使通过第二个Project Color对象为Round,我也会得到所有3个结果。

搜索文本时,我希望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

但是当我尝试将两者结合在一起时,它将无法工作

1 个答案:

答案 0 :(得分:1)

假设您要搜索与给定project.drillType和正fullLeft和正partialLeft some 个ProjectColour对象的所有Color对象:需要SUBQUERY来进行此类请求。诸如此类(未经测试):

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

还请注意,用%@进行关键字替换比谓词格式字符串内的字符串文字更可取,并且==[c]可用于不区分大小写的字符串比较(因此,搜索文本不需要转换为小写)