核心数据:在一对多关系中匹配多个项目的组合

Posted

技术标签:

【中文标题】核心数据:在一对多关系中匹配多个项目的组合【英文标题】:Core Data: Matching a combination of multiple items in a to-many relation 【发布时间】:2018-09-28 21:41:44 【问题描述】:

编辑:忘了提我后来在 Swift 代码中过滤掉了带有不需要颜色的卡片。

所以,这是另一个关于 Core Data 中的多对多关系以及如何为其编写谓词的问题。简而言之,我想在一对多关系中匹配多个项目的组合。

设置

    颜色表有五种颜色:红、绿、白、黑、蓝 卡片表,每张卡片与颜色表有一对多的关系

目标

搜索黑色和/或白色的卡片,意思是:

    卡片可能只有黑色 卡片可能只有白色 卡片可能黑白两色

到目前为止

最好的结果是(简化的):

NSPredicate(format: "ANY color == Black") // Only black cards, good
NSPredicate(format: "ANY color == White") // Only white cards, good
NSPredicate(format: "ANY color == Black OR ANY color == White") // Only black AND white cards, bad

这里有一篇关于 mysql 的非常相似的帖子,以防它有助于进一步澄清问题:

SQL: Make colors from color-table searchable

【问题讨论】:

NSPredicate(format: "color IN %@, ["Black", "White"])? 也试过IN,没有区别。 :// 卡片实体中有多少个对象? 大约。 15 000 - 20 000 个对象。 NSPredicate(格式:“SUBQUERY(color, $C, $C == Black OR $C == White).@count > 0”) 【参考方案1】:

根据@pbasdf 的评论,我想出了以下解决方案(在实际代码中有更好的语法):

// Desired colors let includePredicate = NSPredicate(format: “SUBQUERY(color, $C, $C == 'Black' OR $C == 'White').@count > 0”)

// Undesired colors let excludePredicate = NSPredicate(format: “SUBQUERY(color, $C, $C == 'Green' OR $C == 'Red' OR $C == 'Blue').@count == 0”)

// Combined to one predicate let finalPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [includePredicate, excludePredicate]

【讨论】:

以上是关于核心数据:在一对多关系中匹配多个项目的组合的主要内容,如果未能解决你的问题,请参考以下文章

核心数据以一对多关系保存在后台

核心数据 - NSFetchRequestResult:结果中的一对多关系中的项目数?

获取核心数据中一对多关系的计数

核心数据:以一对多关系存储有序值

核心数据以一对多关系排序

核心数据 - 以一对多关系访问实例与获取请求?