CoreData Predicate 获取包含数组中任何单词的每个句子

Posted

技术标签:

【中文标题】CoreData Predicate 获取包含数组中任何单词的每个句子【英文标题】:CoreData Predicate get every sentence that contains any word in array 【发布时间】:2018-04-29 09:54:24 【问题描述】:

在 Swift 4 中,我有一个具有字符串属性“englishsentence”的 CoreData“句子”模型。我还有一个“单词”数组,并且想获取“englishsentence”属性包含数组中一个或多个单词的所有句子。

var words = ["today", "yesterday", "tomorrow"]

这个数组只是一个例子。它应该在运行时改变并且可以有任意长度。

在 fetch 请求中,我试图做这样的事情:

let fetchRequest =
    NSFetchRequest<NSManagedObject>(entityName: "Sentence")
let predicate = NSPredicate(format: "ANY englishsentence CONTAINS ANY word IN %@", words)
    fetchRequest.predicate = predicate

我能够为所有包含一个特定单词的句子创建一个谓词。但是,除非我遍历单词数组并为每个单词发出新的获取请求,否则我无法让它与单词数组一起工作。但这似乎非常低效。

【问题讨论】:

【参考方案1】:

一种选择是创建一个“复合谓词:”

let words = ["today", "yesterday", "tomorrow"]

let predicates = words.map 
    NSPredicate(format: "englishsentence CONTAINS %@", $0)

let predicate = NSCompoundPredicate(orPredicateWithSubpredicates: predicates)

另一种选择是匹配正则表达式:

let regex = ".*(" + words.map 
    NSRegularExpression.escapedPattern(for: $0)
.joined(separator: "|") + ").*"

let predicate = NSPredicate(format: "englishsentence MATCHES %@", regex)

要仅匹配“整个单词”,您可以添加单词边界模式\b

let regex = ".*\\b(" + words.map 
    NSRegularExpression.escapedPattern(for: $0)
.joined(separator: "|") + ")\\b.*"

【讨论】:

感谢您的快速回答!帮我解决了

以上是关于CoreData Predicate 获取包含数组中任何单词的每个句子的主要内容,如果未能解决你的问题,请参考以下文章

不相关实体的CoreData Fetch Predicate

在 CoreData 中存储和获取字典数组

coredata - 获取具有最大值的不同行

如何在 onDelete 中获取当前的 CoreData 项

Swift CoreData NSPredicate

RestKit 将包含 lat & lng 的数组映射到 CoreData