我已经尝试了这两个 NSPredicate
:
let predicate = NSPredicate(format: “personID == %lld", id)
let predicate = NSPredicate(format: “personID == %d", id)
我启用了 SQL 日志记录并在 SQL 查询结束时看到了这一点:
WHERE t0.ZPERSONID = ?
在变量 View 中,id
的值为 Int64(156)
,但无论我用什么代替 id
,生成的 SQL 查询的 WHERE 子句具有 t0.ZPERSONID = ?
。因此,谓词是无用的,我每次都得到重复的记录插入。我如何获得 t0.ZPERSONID = 156
?
最佳答案
WHERE t0.ZPERSONID = ?
是准备好的语句的(一部分)。要查看参数绑定(bind)到哪些值,请将 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
关于swift - 核心数据 - 为什么我的 NSPredicate 没有产生正确的 SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43911501/