我有一个使用Core Data的iOS 4项目。在设计核心数据模型时,属性包含Integer 64
,Integer 32
,Integer 16
,Decimal
,Double
,Float
和{{ 1}}。
但是在生成的Boolean
子类中,它们都是NSManagedObject
。因此,当我使用它时,如何判断NSNumber*
是NSNumber
,long
,double
还是float
?
答案 0 :(得分:8)
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:myManagedObjectContext];
NSAttributeDescription *attribute = [[entity attributesByName] objectForKey:@"myAttribute"];
if ([attribute attributeType] == NSInteger32AttributeType) {
// We have an Integer32
// ...
}
检查NSAttributeDescription.h
标题以了解NSInteger32AttributeType
以外的其他有效属性类型。
答案 1 :(得分:2)
NSNumber
与CFNumber进行免费桥接,CFNumber
可以执行此操作:
NSNumber *someNum = [myManagedObject someNum];
CFNumberType t = CFNumberGetType((CFNumberRef)someNum);
CFNumberType
枚举值告诉您数字类实际用于存储值的类型。但是这种类型并不能保证你在创建数字时所说的那样,所以如果你想知道模型所期望的类型,你应该像Ole Begemann建议的那样去获取{{1}的属性类型。 }。
答案 2 :(得分:0)
我不确定是否有办法知道这一点,但为了让您的生活更轻松,您可以为每个核心数据实体创建一个类别,并添加与您的属性的实际类型相匹配的新的setter和getter。在那些setter / getters上,你必须进行数据转换并调用生成的Core Data setter / getters。
答案 3 :(得分:0)
核心数据层只能处理对象,您看到的不同选择是如何存储在底层数据库中。 NSNumber类可以在上述值之间自由“转换”。只需选择在您的情况下有意义的事情。是一个布尔?然后保存它(在数据库中占用更少的空间)你需要高精度做双倍等。当你在运行时处理值时,NSNumber将为你处理一切。 所以在代码中访问的bool看起来像这样:
if([[NSManagedObject isActive] boolValue])
或设置:
[[NSManagedObject setIsActive:[NSNumber numberWithBool:YES]];