iOS Swift 复合谓词
Posted
技术标签:
【中文标题】iOS Swift 复合谓词【英文标题】:iOS Swift Compound Predicate 【发布时间】:2019-06-09 17:07:30 【问题描述】:我正在尝试在 Core Data 中搜索特定项目
我有一个实体颜色,它有一个 NSSet 的 ProjectColour 实体。 ProjectColour 实体有一个名为 project 的字段,它是一个项目实体,以及两个名为 fullLeft 和 partialLeft 的 int 字段。这有一个名为 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])
这在搜索 Round 作为类型但使用正方形时有效,它返回错误的对象 IE。 两个对象,一个是正方形但部分和完整的对象等于 0 第二个是一个部分等于 1 的 Round
示例 3个颜色对象
1 2 33 个项目颜色对象
第一。颜色(链接到颜色)= 1,完整 = 1,部分 = 1,项目(链接到项目实体)- 钻孔类型 = 方形 第二。颜色 = 2,完整 = 1,部分 = 1,项目(链接到项目实体)- 钻孔类型 = 圆形 第三。颜色(链接到颜色)= 1,完整 = 0,部分 = 0,项目(链接到项目实体)- 钻孔类型 = 方形搜索时,我得到正方形,我得到所有 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
但是当我尝试将两者结合起来时它不起作用
【问题讨论】:
“我正在尝试所有具有 Square 的 DrillType 且 fullLeft 和 partialLeft > 0 的对象” – 这将是 ProjectColour 对象的列表,而不是 Color 对象. 我正在获取 Color 对象。没有 searchText 的默认搜索是列出所有 Color 对象,否则我只会得到具有 ProjectColour 对象的 Colors,而不是所有对象。可以搜索色号,也可以搜索特定关键字 【参考方案1】:假设您要搜索所有具有 一些 与给定 project.drillType
和正 fullLeft
和正 partialLeft
相关的 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]
可用于不区分大小写的字符串比较(这样搜索文本不需要转换为小写)
【讨论】:
完全没有结果。小写是纯粹的,因此用户搜索它的大小写无关紧要,实际值以大写字母开头。即 Square/sQuare,square 都搜索 Square @CeriTurner:你能以某种方式展示一个样本数据集(以及预期的结果列表)吗?也许我误解了你的问题。 在主帖中添加了一些信息 @CeriTurner:那么您要获取哪些对象?没有具有方形钻头类型且 fullLeft 和 partialLeft > 0 的 ProjectColour。 搜索文本时,我想要 Square 的所有 ProjectColour.project.drillType 和 ProjectColour.fullLeft > 0 AND ProjectColour.partialLeft > 0 fetchRequest.predicate = NSPredicate(format: "ANY projectColours.project.drillType == 'Square'") - 工作 fetchRequest.predicate = NSPredicate(format: "ANY projectColours.fullLeft > 0 OR ANY projectColours.partialLeft > 0") - 工作但是当我尝试将两者结合起来时它不起作用跨度>以上是关于iOS Swift 复合谓词的主要内容,如果未能解决你的问题,请参考以下文章