核心数据 - 为啥我的 NSPredicate 没有产生正确的 SQL 查询?
Posted
技术标签:
【中文标题】核心数据 - 为啥我的 NSPredicate 没有产生正确的 SQL 查询?【英文标题】:Core Data - why is my NSPredicate not resulting in the correct SQL query?核心数据 - 为什么我的 NSPredicate 没有产生正确的 SQL 查询? 【发布时间】:2017-05-11 09:27:02 【问题描述】:这两个我都试过了NSPredicate
s:
let predicate = NSPredicate(format: “personID == %lld", id)
let predicate = NSPredicate(format: “personID == %d", id)
我启用了 SQL 日志记录,并在 SQL 查询结束时看到了这一点:
WHERE t0.ZPERSONID = ?
在变量视图中,id
的值为 Int64(156)
,但无论我用什么代替 id
,生成的 SQL 查询的 WHERE 子句都有 t0.ZPERSONID = ?
。因此,谓词是无用的,我每次都会插入重复的记录。如何获得t0.ZPERSONID = 156
?
【问题讨论】:
您也可以在日志中检查值,但所有值将用逗号分隔,您可以将它们放在上面的查询中 @VarunNaharia 很抱歉,但我不明白你的评论是什么意思。您指的是什么日志,我在哪里可以看到这些值? @VarunNaharia 在 Xcode 的控制台日志中添加的唯一 SQL 日志记录是一个查询,其中我发布了 WHERE 子句。没有别的了。 @Questioner:将 Core Data 调试级别设置为 3(请参阅***.com/a/12306537/1187415),然后您将看到 SQLite 查询绑定到哪些值。 这意味着查询是“WHERE t0.ZPERSONID = 2595”。 – 如果id
是Int64
,那么NSPredicate(format: "personID == %lld", id)
应该是正确的。 print(predicate)
显示什么?
【参考方案1】:
WHERE t0.ZPERSONID = ?
是(部分)准备好的语句。要查看参数绑定到哪些值,请将 Core Data 调试级别设置为 3(比较 How to print Core Data debug values?):
-com.apple.CoreData.SQLDebug 3
-com.apple.CoreData.Logging.stderr 1
print(predicate)
也有助于检查创建的谓词
为了正确。
在您的情况下,问题是您传递了一个 NSNumber
实例
作为参数,但%lld
格式需要Int64
。
您可以将NSNumber
转换为Int64
let id = NSNumber(value: Int64(156))
let p1 = NSPredicate(format: "personID == %lld", id.int64Value)
print(p1) // personID == 156
或者更简单,改用%@
格式:
let p2 = NSPredicate(format: "personID == %@", id)
print(p2) // personID == 156
【讨论】:
以上是关于核心数据 - 为啥我的 NSPredicate 没有产生正确的 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章
核心数据:fetchResultsController 中的 NSPredicate 是不是可以为每一行返回多个对象,进入我的表视图?