将 NSNumber 设置为 NSManagedObject 属性

Posted

技术标签:

【中文标题】将 NSNumber 设置为 NSManagedObject 属性【英文标题】:Setting NSNumber to NSManagedObject attribute 【发布时间】:2013-08-01 07:45:49 【问题描述】:

我的模型中有属性为“id”的实体,数据类型为整数 64。 我正在使用属性@property (nonatomic, retain) NSNumber * id;。 我使用

创建 NSManagedObject
id tempItem = [NSEntityDescription insertNewObjectForEntityForName:@"XYZ" 
                inManagedObjectContext:context];

并设置 NSNumber myID 值[tempItem setValue:myID forKey:@"id"];

问题是:当我使用打印描述打印 NSNumber myID 时,它会显示正确的数字,但是当我使用上面的代码将其设置为我的 NSManagedObject 并打印 NSManagedObject 时,它会变为负值。 我正在尝试设置12941051589483540916(这个数字是有效的interger64),它被设置为-5505692484226010700

我做错了什么?

提前致谢!

【问题讨论】:

如何将 NSNumber 转换为 NSString 并将其设置为 NSManagedObject 如果您使用的是 iPhone(也可能是 iPad),它是 32 位平台,我认为您无法存储大于 32 位最大 int 的 int。即使你设置了 integer64。 @NicolasManzini:Core Data 可以在 ios 上毫无问题地存储 64 位数字。 【参考方案1】:

使用id 作为属性名称是一个非常糟糕的主意。 id 是一种类型,即指向泛型对象的泛型指针,我认为这会产生不止一个问题,无论是现在还是将来。

在 Core Data 中,我通常使用以下格式 ID 创建唯一标识符属性,即对于 Post 类,我将拥有 @property (nonatomic, retain) NSNumber *postID;

【讨论】:

【参考方案2】:

12941051589483540916 不是有效的“64 整数”。大于

2^63 - 1 = 9223372036854775807

因此不适合 有符号 64 位数字的范围。

Core Data "Integer 64" 是有符号的 64 位数字,因此

12941051589483540916 = 0xB397D9DB232BB1B4

被解释为负数-5505692484226010700

如果您知道托管对象中存储的值应该表示无符号数量, 您必须将它们转换为无符号类型,例如

uint64_t theId = [[tempItem valueForKey:@"id"] unsignedLongLongValue];

【讨论】:

我认为那是无符号的,所以认为 2^64 -1 作为范围.. uint64_t theId = [[tempItem valueForKey:@"id"] unsignedLongLongValue];是的,但我现在更喜欢存储为字符串。谢谢!!

以上是关于将 NSNumber 设置为 NSManagedObject 属性的主要内容,如果未能解决你的问题,请参考以下文章

将 NSString 转换为特定于语言环境的 NSNumber

为 NSNumber 值设置精度

从 plist/dictionary 转换为 NSNumber 时出错

如何将 NSNumber 转换和比较为 BOOL?

NSNumber 丢失十进制数字

将 NSNumber 转换为 long