【问题标题】:Core data Fetch request error for predicate谓词的核心数据获取请求错误
【发布时间】:2017-10-13 20:13:06
【问题描述】:

需要

我必须找到 rec_name 为 "Apple 256GB Macbook" & isActive == true 的记录。

获取请求

fetchRequest.predicate = NSPredicate(format: "rec_name LIKE[cd] *%@* AND rec_name LIKE[cd] *%@* AND isActive = %@","apple","macbook",true)

错误

Unable to parse the format string "rec_name LIKE[cd] *%@* AND rec_name LIKE[cd] *%@* AND isActive = %@"

谢谢,

【问题讨论】:

  • Bool 的占位符是 %d%ld 而不是 %@
  • @vadian,感谢您的帮助,但仍然无法正常工作!
  • 试试这个: let predicate = NSPredicate(format: "rec_name LIKE[cd] %@ AND rec_name LIKE[cd] %@ AND isActive = %@","apple","macbook",NSNumber(booleanLiteral: true))
  • 试试这个 fetchRequest.predicate = NSPredicate(format: "rec_name LIKE[cd] %@ AND rec_name LIKE[cd] %@ AND isActive = %d","apple","macbook",true )

标签: ios iphone swift database core-data


【解决方案1】:

问题是因为*%@* 这里%@ 之间的* 没有被字符串参数替换,所以NSPredicate 不能让你的查询LIKE *apple*LIKE *macbook* 你需要做什么是使用通配符和 Like 来创建一个搜索字符串,只需使用%@,同样@Vadian 建议使用数字而不是Bool

let searchkeyword1 = "apple"
let searchkeyword2 = "macbook"

//Make search string wildcards charaters
let searchString1 = "*\(searchkeyword1)*"
let searchString2 = "*\(searchkeyword2)*"

fetchRequest.predicate = NSPredicate(format: "rec_name LIKE[cd] %@ AND rec_name LIKE[cd] %@ AND isActive = %@", searchString1,searchString2, true as NSNumber)

这里的连击选项是您可以使用CONTAINS 而无需使用通配符。

fetchRequest.predicate = NSPredicate(format: "rec_name CONTAINS[cd] %@ AND rec_name CONTAINS[cd] %@ AND isActive = %@", "apple","macbook", true as NSNumber)

如果您想查找所有以 apple 开头并以 macbook 结尾的记录,您可以再做一件事,然后您可以简单地使用 BEGINSWITHENDSWITH

fetchRequest.predicate = NSPredicate(format: "rec_name BEGINSWITH[cd] %@ AND rec_name ENDSWITH[cd] %@ AND isActive = %@", "apple","macbook", true as NSNumber)

【讨论】:

  • 更好:NSNumber(value: true)true as NSNumber,比较 stackoverflow.com/a/42933246/1187415。通常没有理由调用“xxxLiteral”初始值设定项,只有编译器需要它们。
  • @MartinR 感谢您的建议,已编辑答案
【解决方案2】:

试试这个

fetchRequest.predicate =  NSPredicate(format: "rec_name LIKE[cd] %@ AND rec_name LIKE[cd] %@ AND isActive = %@","apple","macbook",NSNumber(booleanLiteral: true))

【讨论】:

    【解决方案3】:

    您需要设置如下谓词查询:

    fetchRequest.predicate = NSPredicate(format: "rec_name == %@ AND isActive == %@" , "Apple 256GB Macbook", NSNumber(booleanLiteral: true))
    

    如果您正在寻找完美匹配,我认为我们不需要使用 Like。

    【讨论】:

      【解决方案4】:

      试试这个

      NSPredicate(format: "rec_name == %@ AND rec_name == %@ AND isActive = %d","apple","macbook",true)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 2019-11-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多