gpt4 book ai didi

swift - Bool 谓词导致零行计数

转载 作者:行者123 更新时间:2023-11-28 07:28:13 25 4
gpt4 key购买 nike

当我尝试执行 CoreData 获取请求时,我得到了正确的行数。

let req = Track.fetchRequest()
return try context.count(for: req)

// result: 81

有效:

SQLite browser request

当我尝试添加 bool 条件时,

let req = Track.fetchRequest()
req.predicate = NSPredicate(format: "isSentToServer = NO")
return try context.count(for: req)

// result: 0

事实并非如此。结果总是0(但它仍然应该是81)无论我尝试什么:

NSPredicate(format: "isSentToServer = %i", NSNumber(value: false))
NSPredicate(format: "isSentToServer = %@", NSNumber(value: false))
NSPredicate(format: "isSentToServer = 0")
NSPredicate(format: "isSentToServer = %@", false)
NSPredicate(format: "isSentToServer = %@", 0)
NSPredicate(format: "isSentToServer != YES")
NSPredicate(format: "isSentToServer == NO")
NSPredicate(format: "isSentToServer == %@", "NO")

注意:isSentToServer 是一个正确识别的属性,更改大小写或添加 Z 都无济于事。

是否有大量 Swift 教程作者不知道的更改?

编辑:Track 类由核心模型实体编辑器自动生成,isSentToServer 数据类型为 Bool(编辑器中的“Boolean”)(不是 Bool ?)

更新

这是我使用 -com.apple.CoreData.SQLDebug 1 测试代码的输出,如建议的那样(谓词:isSentToServer != YES):

CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
CoreData: sql: pragma recursive_triggers=1
CoreData: sql: pragma journal_mode=wal
CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_MODELCACHE'
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'ACHANGE'
CoreData: sql: SELECT COUNT(*) FROM ZTRACK
CoreData: annotation: total count request execution time: 0.0004s for count of 90.
Total track objects: 90
CoreData: sql: SELECT COUNT( DISTINCT t0.Z_PK) FROM ZTRACK t0 WHERE t0.ZISSENTTOSERVER <> ?
CoreData: annotation: total count request execution time: 0.0005s for count of 0.
Track objects pending upload: 0

对于 = NO 和其他“相等”的情况,它生成 SQL "= ?" 而不是

如何创建 Track 对象?

let track = Track(context: context) // context is from AppDelegate, auto-generated by Xcode
// set up some properties
// not assigning any isSentToServer value explicitly
context.save() // no errors

编辑 2:请注意,我已经在我的 Xcode 中尝试了 iPhone 6 模拟器的“删除数据”,并重新创建了我的 Track 对象,但第二个请求仍然返回零行数。

Xcode:版本 10.2 (10E125)

针对 iOS SDK/版本:11.0 或 12.2,无区别

$ xcodebuild -showsdks
iOS SDKs:
iOS 12.2 -sdk iphoneos12.2

iOS Simulator SDKs:
Simulator - iOS 12.2 -sdk iphonesimulator12.2

最佳答案

这是一个带有解决方法的评论。

有帮助的是:

  1. 对象设置track.isSentToServer = false显式
  2. 对象明确设置track.time = Date()(我不在谓词中使用这个字段)(生成的类型是: 日期?)

因此,谓词有效。

不过,我的期望很合乎逻辑:

  1. false 必须是默认值,因为它具有 Bool 类型(不是 Bool?)。
  2. nil 必须是 Date? 属性的默认值,并且不得影响未提及它的谓词。

我无法找到有关此行为是否已记录的信息。

关于swift - Bool 谓词导致零行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55786423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com