Swift 中 NSFetchRequest 的多个 NSPredicates?

Posted

技术标签:

【中文标题】Swift 中 NSFetchRequest 的多个 NSPredicates?【英文标题】:Multiple NSPredicates for NSFetchRequest in Swift? 【发布时间】:2016-02-08 08:45:38 【问题描述】:

目前,我有一个带有关联 NSPredicate 的简单 NSFetchRequest。但是,我希望有一种方法可以附加多个谓词。我在 Objective C 中看到过示例,但在 Swift 中没有看到过。

你能以某种方式定义一个 NSPredicate 列表或将多个 NSPredicate 对象附加到单个 NSFetchRequest 吗?

谢谢!

【问题讨论】:

API 是相同的,所以您看到的示例是有效的 - 如果您有问题,请尝试并显示代码 【参考方案1】:

您可以使用“NSCompoundPredicate”。例如:

let converstationKeyPredicate = NSPredicate(format: "conversationKey = %@", conversationKey)
let messageKeyPredicate = NSPredicate(format: "messageKey = %@", messageKey)
let andPredicate = NSCompoundPredicate(type: NSCompoundPredicateType.AndPredicateType, subpredicates: [converstationKeyPredicate, messageKeyPredicate])
request.predicate = andPredicate

您可以更改为“AndPredicateType”或“OrPredicateType”

【讨论】:

但是如果这个例子中的messageKeyPredicate,只存在于特定的情况下呢?在尝试构建 NSCompoundPredicate 时,是否有一种避免意大利面代码的优雅方法? 没关系,只需构建一个 NSPredicates 列表就可以了!谢谢! 我们可以使用 andPredicate - 或者有什么区别?让 andPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicateIsNumber, predicateIsEnabled])【参考方案2】:

Swift 4 更新

let predicateIsNumber = NSPredicate(format: "isStringOrNumber == %@", NSNumber(value: false))
let predicateIsEnabled = NSPredicate(format: "isEnabled == %@", NSNumber(value: true))
let andPredicate = NSCompoundPredicate(type: .and, subpredicates: [predicateIsNumber, predicateIsEnabled])

//check here for the sender of the message

let fetchRequestSender = NSFetchRequest<NSFetchRequestResult>(entityName: "Keyword")
fetchRequestSender.predicate = andPredicate

最新 Swift 版本的变化是:

`NSCompoundPredicateType.AndPredicateType` replaced by `NSCompoundPredicate.LogicalType.and`

希望对你有帮助!!!

谢谢

【讨论】:

我可以有两种谓词,一种是.and 条件,另一种是.or 条件? 我想可以把它包裹在另一个或复合谓词中

以上是关于Swift 中 NSFetchRequest 的多个 NSPredicates?的主要内容,如果未能解决你的问题,请参考以下文章

NSFetchedResultsController/NSFetchRequest 与 NSManagedObject 的多对多关系

NSFetchRequest 上的 Swift2.0 CoreData 问题

Swift 3 - NSFetchRequest 不同的结果

Swift - NSFetchRequest 错误

Swift NSFetchRequest 按一个属性分组

如何将类型应用于 NSFetchRequest 实例?