swift - 核心数据 - 为什么我的 NSPredicate 没有产生正确的 SQL 查询?

标签 swift sqlite core-data nspredicate

我已经尝试了这两个 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/

相关文章:

ios - 选择时 UICollectionviewCell backgroundColor 不更改

ios - 从 UITableViewCell 中的 UITextField 访问文本

swift - IteratorProtocol 需要 next() 函数来实现通用链表

sqlite - Windows 8应用程序-与Skydrive的Sqlite同步

android - 如何在 Android 中将 XML 文件从 http 解析为 SQLite

sql - 在sqlite中返回已删除的行

ios - 在嵌套的 NSManagedObjectContext 中缓慢删除和保存

ios - 合并托管对象上下文的方法

ios - TableView 的嵌套 Firebase 数据

ios - 使用 +[NSThread sleep :] to resolve a deadlock issue