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 3

3 个项目颜色对象

第一。颜色(链接到颜色)= 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 复合谓词的主要内容,如果未能解决你的问题,请参考以下文章

复合谓词 NSPredicate

复合谓词不返回结果

谓词复合

XPath - 复合谓词 + 测试值是不是不以某事开头

快速,在具有复合谓词的提取结果控制器中找不到实体的键路径

Oracle 复合索引设计原理——前缀性和可选性