Swift Bool谓词导致行数为零
当我尝试执行coredatafetch请求时,我得到了正确的行数Swift Bool谓词导致行数为零,swift,core-data,nspredicate,Swift,Core Data,Nspredicate,当我尝试执行coredatafetch请求时,我得到了正确的行数 let req = Track.fetchRequest() return try context.count(for: req) // result: 81 它的工作原理是: 当我尝试添加布尔条件时 let req = Track.fetchRequest() req.predicate = NSPredicate(format: "isSentToServer = NO") return try context.coun
let req = Track.fetchRequest()
return try context.count(for: req)
// result: 81
它的工作原理是:
当我尝试添加布尔条件时
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
类由核心模型实体编辑器自动生成,ISentToServer数据类型为Bool
(“编辑器中的布尔值”)(不是Bool?
)
更新
下面是我的测试代码的输出,其中包含建议的-com.apple.CoreData.SQLDebug 1
(谓词:isSentToServer!=YES
):
编辑2:注意,我在Xcode中尝试了“擦除数据”iPhone6模拟器,并重新创建了我的轨迹对象,但第二个请求仍然返回零行数
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
这是一个带有变通方法的注释 有帮助的是以下因素的结合:
track.isSentToServer=false
track.time=Date()
(我不在谓词中使用此字段)(生成的类型是:Date?
)false
必须是默认值,因为它具有Bool
类型(不是Bool?
)李>
nil
必须是Date?
属性的默认值,并且它不能影响未提及它的谓词我无法找到有关此行为是否有文档记录的信息。这是一个带有解决方法的注释 有帮助的是以下因素的结合:
track.isSentToServer=false
track.time=Date()
(我不在谓词中使用此字段)(生成的类型是:Date?
)false
必须是默认值,因为它具有Bool
类型(不是Bool?
)李>
nil
必须是Date?
属性的默认值,并且它不能影响未提及它的谓词我无法找到有关此行为是否有文档记录的信息。谓词编程指南指出,对于布尔值,应使用类似于
“someAttribute==YES”的内容。
。我在您的列表中没有看到的一件事是“isSentToServer==NO”
。试试看。“isSentToServer=NO”
应该适用于布尔属性(=
和=
在谓词中被同等对待)。为了完整起见,更新显示实体声明的问题,清楚地显示如何声明isSentToServer
属性。我确信,模拟器中的iOS应用程序在第二次请求时显示结果0。我尝试交换请求的顺序(带谓词和不带谓词),但没有区别。我从视图执行这些请求将显示()
,并使用打印()报告。我使用相同的上下文,但每次调用都使用新的FetchRequest。激活核心数据调试(启动参数-com.apple.CoreData.SQLDebug 3
,请参阅)并检查输出。谓词编程指南规定,对于布尔值,应使用类似“someAttribute==YES”
的内容。我在您的列表中没有看到的一件事是“isSentToServer==NO”
。试试看。“isSentToServer=NO”
应该适用于布尔属性(=
和=
在谓词中被同等对待)。为了完整起见,更新显示实体声明的问题,清楚地显示如何声明isSentToServer
属性。我确信,模拟器中的iOS应用程序在第二次请求时显示结果0。我尝试交换请求的顺序(带谓词和不带谓词),但没有区别。我从视图执行这些请求将显示()
,并使用打印()报告。我使用相同的上下文,但每次调用都使用新的FetchRequest。激活核心数据调试(启动参数-com.apple.CoreData.SQLDebug 3
,请参阅)并检查输出。根据我的经验,布尔属性可以有三个值:true、false和null。fetch谓词和filter谓词处理空值的方式不同。解决方案:始终为数据模型中的布尔属性设置默认值。我可以询问您的经验吗?我看到你们在苹果上编写代码,我只是从来没有看到布尔值有三个可能的值,特别是在SQL中。仅适用于特定框架中的空值,如Swift或C中的bool?
,但我在自动生成的实体类中有bool
。在SQL/SQLite中,bool字段是tinyint或integer,0被认为是false,而不是null?可选布尔属性的值可以是nil
。数据模型中的默认值是None。根据我的经验,布尔属性可以有三个值:true、false和null。fetch谓词和filter谓词处理空值的方式不同。解决方案:始终为数据模型中的布尔属性设置默认值。我可以询问您的经验吗?我看到你们在苹果上编写代码,我只是从来没有看到布尔值有三个可能的值,特别是在SQL中。仅适用于特定框架中的空值,如Swift或C中的bool?
,但我在自动生成的实体类中有bool
。在SQL/SQLite中,bool字段是tinyint或integer,0被认为是false,而不是null?可选布尔属性的值可以是nil
。数据模型中的默认值为“无”。
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
$ xcodebuild -showsdks
iOS SDKs:
iOS 12.2 -sdk iphoneos12.2
iOS Simulator SDKs:
Simulator - iOS 12.2 -sdk iphonesimulator12.2