将 NSNumber 设置为 NSManagedObject 属性
Posted
技术标签:
【中文标题】将 NSNumber 设置为 NSManagedObject 属性【英文标题】:Setting NSNumber to NSManagedObject attribute 【发布时间】:2013-08-01 07:45:49 【问题描述】:我的模型中有属性为“id”的实体,数据类型为整数 64。
我正在使用属性@property (nonatomic, retain) NSNumber * id;
。
我使用
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