核心数据 - 为什么我的NSPredicate没有导致正确的SQL查询?

时间:2017-05-11 09:27:03

标签: swift sqlite core-data nspredicate

我已尝试过这两个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

1 个答案:

答案 0 :(得分: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