NSPredicate 用于搜索带双引号的字符串

NSPredicate for searching a string with double quotes

coredata模型中的属性元素是一个字符串(json字符串格式),它是一个字典数组,如下所示,

一个元素有

"[{"tagName":"sad","count":2},{“tagName":"happy","count":1}]"

其他有

"[{"tagName":"sad1","count":2},{“tagName":"happy1","count":1},{“tagName":"nothappy","count":1}]"

需要参考标记名搜索列表。

如果我使用下面的谓词,

tagName = "sad"
tagNameFilter += String(format: "vrTags CONTAINS[cd] \"%@\"", tagName)

这是 return两个元素。它应该 return 单独第一个元素

如果我不使用双引号

tagName = "sad"
tagNameFilter += String(format: "vrTags CONTAINS[cd] %@", tagName)

崩溃原因:

unimplemented SQL generation for predicate : (vrTags CONTAINS[cd] sad) (LHS and RHS both keypaths) with userInfo of (null)

如果我用

tagName = "sad"
tagNameFilter += String(format: "vrTags CONTAINS[cd] \"\"%@\"\"", tagName)

崩溃原因:Unable to parse the format string

如何解决这个过滤器问题?如有任何建议,我们将不胜感激。

要搜索包含引号的字符串 "sad",您必须将该字符串 和引号 作为参数传递给 NSPredicate(format:) .这可以通过字符串插值来完成:

let tagName = "sad"
let predicate = NSPredicate(format: "vrTags CONTAINS[cd] %@", "\"\(tagName)\"")
print(predicate) // vrTags CONTAINS[cd] "\"sad\""

并且从不使用String(format:)和字符串连接来构建复杂的谓词。这是非常容易出错的,因为谓词字符串的引用和转义规则与格式化字符串的引用和转义规则不同。

如果您需要使用“AND”组合多个条件,请按

let p1 = NSPredicate(...)
let p2 = NSPredicate(...)
// ...
let predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [p1, p2, ...])