如何告诉Core Data NSNumber属性类型

时间:2011-04-21 14:36:53

标签: iphone nsnumber

我有一个使用Core Data的iOS 4项目。在设计核心数据模型时,属性包含Integer 64Integer 32Integer 16DecimalDoubleFloat和{{ 1}}。

但是在生成的Boolean子类中,它们都是NSManagedObject。因此,当我使用它时,如何判断NSNumber*NSNumberlongdouble还是float

4 个答案:

答案 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]];