iOS Swift 复合谓词



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

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

我正在尝试所有具有钻头类型的对象 正方形 并且全左和部分左> 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
  • 阿拉伯数字
  • 3

3 项目颜色对象

1st. 颜色(链接到颜色)= 1,完整 = 1,
  • 部分 = 1,项目(链接到项目实体)- 钻头类型 = 正方形
  • 2nd. 颜色 = 2,完整 = 1,部分 = 1,项目(链接到项目实体)- 钻孔类型 = 圆形
  • 3rd. 颜色(链接到颜色)= 1,完整 = 0,
  • 部分 = 0,项目(链接到项目实体)- 钻头类型 = 正方形

搜索时,我得到正方形,我得到所有 3 个结果返回,即使通过第二个项目颜色对象是圆形

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

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

假设您要搜索所有具有相关ProjectColor对象且具有给定project.drillType和正fullLeft和正partialLeft的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]可用于不区分大小写的字符串比较(因此搜索文本不需要转换为小写)

最新更新