如何区分 CoreData 中的布尔值和 NSNumber

Posted

技术标签:

【中文标题】如何区分 CoreData 中的布尔值和 NSNumber【英文标题】:How to tell the difference between a Boolean and an NSNumber in CoreData 【发布时间】:2015-07-02 09:24:58 【问题描述】:

我有一些解析代码用于序列化和反序列化来自我们的 Web 服务的对象,但在序列化布尔值时遇到了一些问题。

序列化如下:

 - (NSDictionary *)dictionaryRepresentationWithMapping:(NSDictionary *)mappingDictionary

    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc]init];

    for (id key in[mappingDictionary allKeys])
    
        id value = [self valueForKey:key];

        if ((value != [NSNull null]) && (![value isKindOfClass:[NSNull class]]) && (value != nil))
        
            [dictionary setObject:value forKey:mappingDictionary[key]];
        
    

    return [NSDictionary dictionaryWithDictionary:dictionary];

问题是当我在我的 NSManagedObject 上调用 valueForKey: 然后将其添加到我的字典中时,我最终会像调用一样设置值:

[dictionary setObject:@1 forKey:mappingDictionary[key]];

代替:

[dictionary setObject:@YES forKey:mappingDictionary[key]];

这意味着当我将其转换为 JSON 时,在下一阶段,我将向服务器发送 1 而不是 true。

所以我需要一种方法来保留这样一个事实,即这是一个 NSNumber 代表一个布尔值而不是一个数字。我已经尝试过要求上课,但我刚刚获得了 NSNumber。有没有办法我可以自动保留它或失败,有没有办法我可以查阅模型以查看属性类型设置为什么?

【问题讨论】:

管理布尔值的下划线类是 __NSCFBoolean 但我不建议检查它,因为 NSNumber 是一个类簇 看这里***.com/questions/2518761/get-type-of-nsnumber 【参考方案1】:

每个实体的元数据都存储在NSEntityDescriptionNSAttributeDescription 中。您可以通过以下方式从NSManagedObject 访问它们:

//you can put this inside the for loop
NSAttributeDescription *attributeDescription = self.entity.attributesByName[key];
if(attributeDescription.attributeType == NSBooleanAttributeType) 
  //it is a boolean attribute

【讨论】:

【参考方案2】:

向服务器发送调用时,您可以这样做: [dict setValue:[NSNumber numberWithBool:YES] forKey:mappingDictionary[key]]; ; 或者另一种方式,您可以建模服务器端以将其值保留为布尔值,此时只需像这样发送[dict setValue:YES] forKey:mappingDictionary[key]];

希望对你有帮助

【讨论】:

这会正确生成一个密钥,该密钥将在 JSON 中作为布尔值输出。但是,我的问题是我在抽象超类中有一个序列化方法,所以我需要解析来从对象推断类型。

以上是关于如何区分 CoreData 中的布尔值和 NSNumber的主要内容,如果未能解决你的问题,请参考以下文章

如何选择一个 TableViewCell 并将所有其他单元格设置为 CoreData 中的布尔值 NO?

从 CoreData 实体中的 NSNumber 获取 intValue 时无法识别的选择器崩溃

如何在 AEM 中的 json 中获取布尔值和数值 OOB

什么是布尔型(boolean)数据类型?

编辑布尔值和运算符

day02python中的基本数据类型-布尔值和字符串