如何判断 Core Data 的 NSNumber 属性的类型

发布于 2024-11-02 20:53:39 字数 386 浏览 5 评论 0原文

我有一个使用 Core Data 的 iOS 4 项目。当我设计核心数据模型时,属性有Integer 64Integer 32Integer 16Decimal双精度浮点布尔

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

I have an iOS 4 project using Core Data. When I design the Core Data Model, the attributes have Integer 64, Integer 32, Integer 16, Decimal, Double, Float, and Boolean.

But in the generated NSManagedObject subclasses, they are all NSNumber*. So when I use it, how can I tell if that NSNumber is a long, a double, a float, or a BOOL?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

人心善变 2024-11-09 20:53:39
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:myManagedObjectContext];
NSAttributeDescription *attribute = [[entity attributesByName] objectForKey:@"myAttribute"];
if ([attribute attributeType] == NSInteger32AttributeType) {
    // We have an Integer32
    // ...
}

检查 NSAttributeDescription.h 标头,了解除 NSInteger32AttributeType 之外的其他有效属性类型。

NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:myManagedObjectContext];
NSAttributeDescription *attribute = [[entity attributesByName] objectForKey:@"myAttribute"];
if ([attribute attributeType] == NSInteger32AttributeType) {
    // We have an Integer32
    // ...
}

Check the NSAttributeDescription.h header for other valid attribute types besides NSInteger32AttributeType.

海夕 2024-11-09 20:53:39

NSNumber 与 CFNumber 是免费桥接的,CFNumber 可以做到这一点:

NSNumber *someNum = [myManagedObject someNum];
CFNumberType t = CFNumberGetType((CFNumberRef)someNum);

CFNumberType 枚举值告诉您数字类实际使用的类型来储存你的价值。但类型不能保证是您创建数字时所说的类型,因此如果您想知道模型期望什么类型,您应该按照 Ole Begemann 的建议进行操作并获取 AttributeDescription 的属性类型。

NSNumber is toll-free bridged with CFNumber, and CFNumber can do this:

NSNumber *someNum = [myManagedObject someNum];
CFNumberType t = CFNumberGetType((CFNumberRef)someNum);

The CFNumberType enum value tells you the type actually used by the number class to store your value. But the type is not guaranteed to be what you said it should be when you created the number, so if you want to know what type the model expects, you should do as Ole Begemann suggested and get the attribute type of the AttributeDescription.

檐上三寸雪 2024-11-09 20:53:39

我不确定是否有办法知道这一点,但为了让您的生活更轻松,您可以为每个核心数据实体创建一个类别,并添加与属性的实际类型相匹配的新设置器和获取器。在这些设置器/获取器上,您必须进行数据转换并调用生成的核心数据设置器/获取器。

I'm not sure there is a way to know that, but to make your life easier you can create a Category for each Core Data Entity, and add new setters and getters that match the actual type of your attributes. On those setters/getters you have to make the data conversions and invoke the generated Core Data setters/getters.

空‖城人不在 2024-11-09 20:53:39

核心数据层只能处理对象,您看到的不同选择是它将如何存储在底层数据库中。
NSNumber 类可以在上述值之间自由“转换”。只需选择对您的情况有意义的做法即可。是布尔值吗?然后将其保存为这样(在数据库中占用更少的空间)是否需要高精度,是否需要双精度等。当您在运行时处理值时, NSNumber 将为您处理一切。
因此,在代码中访问的 bool 看起来像这样:

if([[NSManagedObject isActive] boolValue])

或设置:

[[NSManagedObject setIsActive:[NSNumber numberWithBool:YES]];

The Core Data layer can only deal with objects, the different selections you see is how it will be stored in the underlying database.
The NSNumber class can "convert" freely between the above values. Just select what makes sense to do in your case. Is is a bool? then save it as such (takes less space in the db) do you need high precision do double etc. When you at runtime deal with the values NSNumber will take care of everything for you.
So a bool accessed in code looks like this:

if([[NSManagedObject isActive] boolValue])

or setting:

[[NSManagedObject setIsActive:[NSNumber numberWithBool:YES]];
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文