如何区分 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】:每个实体的元数据都存储在NSEntityDescription
和NSAttributeDescription
中。您可以通过以下方式从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?