Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift Bool谓词导致行数为零_Swift_Core Data_Nspredicate - Fatal编程技术网

Swift Bool谓词导致行数为零

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

当我尝试执行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.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