核心数据 - 为啥我的 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 【问题描述】:

这两个我都试过了NSPredicates:

            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”。 – 如果idInt64,那么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 是不是可以为每一行返回多个对象,进入我的表视图?

日期的核心数据 NSPredicate

核心数据和 NSPredicate

Swift 核心数据 NSPredicate

核心数据:如何使用 NSPredicate 查找空字段

核心数据,NSPredicate,任何 key.path == nil