ios - iOS Swift 复合谓词
问题描述
我正在尝试在 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 作为类型但带有正方形时有效,它返回错误的对象,即两个对象,一个是正方形但部分和完整的对象等于 0 第二个是部分等于 1 的 Round
示例 3 颜色对象
- 1
- 2
- 3
3 项目颜色对象
- 第一个。颜色(链接到颜色)= 1,完整 = 1,部分 = 1,项目(链接到项目实体)- 钻孔类型 = 方形
- 第二。颜色 = 2,完整 = 1,部分 = 1,项目(链接到项目实体)- 钻孔类型 = 圆形
- 第三。颜色(链接到颜色)= 1,完整 = 0,部分 = 0,项目(链接到项目实体)- 钻孔类型 = 方形
搜索时,我得到正方形,我得到所有 3 个结果返回,即使第二个 Project Color 对象是 Round
搜索文本时,我想要 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 对象的所有 Color 对象,这些对象具有给定的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)
另请注意,关键字替换 with%@
优于谓词格式字符串中的字符串文字,并且==[c]
可用于不区分大小写的字符串比较(因此不需要将搜索文本转换为小写)
推荐阅读
- flutter - How to convert bytes into image in Flutter?
- express - 我写了一个类似教程中解释的代码,但它不起作用。描述中包含错误
- javascript - React:为什么我不能将数据从一个功能组件传递到另一个功能组件?
- reactjs - 海图 | 网络图 - 有没有办法在单击父节点时展开叶节点?
- python - python中是否有一个随机函数可以在一定范围内获得公平的结果?
- ios - iOS 模拟器在添加 Crashlytics 并强制使应用程序崩溃后卡在启动屏幕上
- macos - 在 virtualbox 上配置 macOS 虚拟机时出现未知配置值“/DmisystemVersion”
- postgresql - 当连接数增加时,PgBouncer 性能下降
- puppeteer - 木偶戏中的自动播放
- c++ - 返回带有自定义比较器的 std::set