【问题标题】:NSPredicate for searching a string with double quotesNSPredicate 用于搜索带双引号的字符串
【发布时间】:2019-10-08 11:07:16
【问题描述】:

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)

它返回两个元素。它应该单独返回第一个元素

如果我不使用双引号

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

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

【问题讨论】:

  • tagString CONTAINS[cd] "\"sad\""
  • @vikingosegundo,编辑了问题,请现在检查,需要动态传递值。仍然崩溃。
  • 核心数据中为什么要保存标签为json?为什么没有合适的实体Tag

标签: swift core-data nspredicate predicate


【解决方案1】:

为了搜索包含引号的字符串"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, ...])

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多