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 个颜色对象
- 1
- 2
- 3
3 个项目颜色对象
- 第一。颜色(链接到颜色)= 1,完整 = 1,部分 = 1,项目(链接到项目实体)- Drill Type = Square
- 第二。颜色 = 2,完整 = 1,部分 = 1,项目(链接到项目实体)- Drill Type = Round
- 第三。颜色(链接到颜色)= 1,完整 = 0,部分 = 0,项目(链接到项目实体)- Drill Type = Square
在搜索时,我得到了方形,我得到了所有 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 字符串比较(以便搜索文本不需要转换为小写)
我正在尝试搜索核心数据中的特定项目
我有一个实体颜色,它有一个 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 个颜色对象
- 1
- 2
- 3
3 个项目颜色对象
- 第一。颜色(链接到颜色)= 1,完整 = 1,部分 = 1,项目(链接到项目实体)- Drill Type = Square
- 第二。颜色 = 2,完整 = 1,部分 = 1,项目(链接到项目实体)- Drill Type = Round
- 第三。颜色(链接到颜色)= 1,完整 = 0,部分 = 0,项目(链接到项目实体)- Drill Type = Square
在搜索时,我得到了方形,我得到了所有 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 字符串比较(以便搜索文本不需要转换为小写)