CoreData Predicate 获取包含数组中任何单词的每个句子
CoreData Predicate get every sentence that contains any word in array
在 Swift 4 中,我有一个具有字符串属性 "englishsentence" 的 CoreData "Sentence" 模型。我还有一个 "words" 数组,我想获取所有 "englishsentence" 属性包含数组中一个或多个单词的句子。
var words = ["today", "yesterday", "tomorrow"]
这个数组只是一个例子。它应该在运行时改变并且可以有任何长度。
并且在获取请求中我正在尝试做这样的事情:
let fetchRequest =
NSFetchRequest<NSManagedObject>(entityName: "Sentence")
let predicate = NSPredicate(format: "ANY englishsentence CONTAINS ANY word IN %@", words)
fetchRequest.predicate = predicate
我能够为包含一个特定单词的所有句子创建谓词。但是,除非我当然遍历单词数组并对每个单词发出新的获取请求,否则我无法让它与单词数组一起使用。但这似乎非常低效。
一个选择是创建一个“复合谓词:”
let words = ["today", "yesterday", "tomorrow"]
let predicates = words.map {
NSPredicate(format: "englishsentence CONTAINS %@", [=10=])
}
let predicate = NSCompoundPredicate(orPredicateWithSubpredicates: predicates)
另一种选择是匹配正则表达式:
let regex = ".*(" + words.map {
NSRegularExpression.escapedPattern(for: [=11=])
}.joined(separator: "|") + ").*"
let predicate = NSPredicate(format: "englishsentence MATCHES %@", regex)
要仅匹配“整个单词”,您可以添加单词边界模式 \b
:
let regex = ".*\b(" + words.map {
NSRegularExpression.escapedPattern(for: [=12=])
}.joined(separator: "|") + ")\b.*"
在 Swift 4 中,我有一个具有字符串属性 "englishsentence" 的 CoreData "Sentence" 模型。我还有一个 "words" 数组,我想获取所有 "englishsentence" 属性包含数组中一个或多个单词的句子。
var words = ["today", "yesterday", "tomorrow"]
这个数组只是一个例子。它应该在运行时改变并且可以有任何长度。
并且在获取请求中我正在尝试做这样的事情:
let fetchRequest =
NSFetchRequest<NSManagedObject>(entityName: "Sentence")
let predicate = NSPredicate(format: "ANY englishsentence CONTAINS ANY word IN %@", words)
fetchRequest.predicate = predicate
我能够为包含一个特定单词的所有句子创建谓词。但是,除非我当然遍历单词数组并对每个单词发出新的获取请求,否则我无法让它与单词数组一起使用。但这似乎非常低效。
一个选择是创建一个“复合谓词:”
let words = ["today", "yesterday", "tomorrow"]
let predicates = words.map {
NSPredicate(format: "englishsentence CONTAINS %@", [=10=])
}
let predicate = NSCompoundPredicate(orPredicateWithSubpredicates: predicates)
另一种选择是匹配正则表达式:
let regex = ".*(" + words.map {
NSRegularExpression.escapedPattern(for: [=11=])
}.joined(separator: "|") + ").*"
let predicate = NSPredicate(format: "englishsentence MATCHES %@", regex)
要仅匹配“整个单词”,您可以添加单词边界模式 \b
:
let regex = ".*\b(" + words.map {
NSRegularExpression.escapedPattern(for: [=12=])
}.joined(separator: "|") + ")\b.*"