将 NSDictionary 值保存到核心数据
Issue saving NSDictionary values to core data
注意:请在投入或关闭问题之前完整阅读问题。
我有一个字典 packedData
,其中 NSNumber
类型和键 "example" 的值“1”。我将这个值保存到核心数据中作为
myentity.attribute = [packedData valueForKey:@"example"]; //attribute is of NSNumber type as well.
当我获取数据时,返回的值为“23008”或其他一些不相关的值。调试了一下发现是保存到core data时的值转换问题
有谁知道为什么会出现这种情况或解决方法?
更新:NSString 和 NSDate 类型保存良好(字典中的精确值)。
如果您为整数类型 属性 选择了 "use scalar property",生成的代码类似于
@property (nonatomic) int16_t attribute;
如果取消选中,代码看起来像
@property (nullable, nonatomic, copy) NSNumber *attribute;
第一种情况是原始整数类型;第二个是 NSNumber
对象,Core Data 会将其视为包含整数。
您的代码行如下所示:
myentity.attribute = [packedData valueForKey:@"example"];
valueForKey
调用将 return 一个对象,在您的例子中是 NSNumber
。但是 NSNumber
和标量类型之间没有自动转换。因此,如果您使用的是标量版本,您最终会分配 NSNumber
的指针值。也就是说,您得到的是 NSNumber
的内存地址,而不是它包含的值。
您可以通过
解决此问题
- 不使用标量类型,所以到处都是
NSNumber
。
保持标量类型但随后更改代码行以将对象转换为其整数值:
newEvent.attribute = [[packedData valueForKey:@"example"] integerValue];
编译器应该已经警告过你了!我本以为会看到类似 incompatible pointer to integer conversion assigning to 'int16_t' (aka 'short') from 'id _Nullable'
.
的警告
注意:请在投入或关闭问题之前完整阅读问题。
我有一个字典 packedData
,其中 NSNumber
类型和键 "example" 的值“1”。我将这个值保存到核心数据中作为
myentity.attribute = [packedData valueForKey:@"example"]; //attribute is of NSNumber type as well.
当我获取数据时,返回的值为“23008”或其他一些不相关的值。调试了一下发现是保存到core data时的值转换问题
有谁知道为什么会出现这种情况或解决方法?
更新:NSString 和 NSDate 类型保存良好(字典中的精确值)。
如果您为整数类型 属性 选择了 "use scalar property",生成的代码类似于
@property (nonatomic) int16_t attribute;
如果取消选中,代码看起来像
@property (nullable, nonatomic, copy) NSNumber *attribute;
第一种情况是原始整数类型;第二个是 NSNumber
对象,Core Data 会将其视为包含整数。
您的代码行如下所示:
myentity.attribute = [packedData valueForKey:@"example"];
valueForKey
调用将 return 一个对象,在您的例子中是 NSNumber
。但是 NSNumber
和标量类型之间没有自动转换。因此,如果您使用的是标量版本,您最终会分配 NSNumber
的指针值。也就是说,您得到的是 NSNumber
的内存地址,而不是它包含的值。
您可以通过
解决此问题- 不使用标量类型,所以到处都是
NSNumber
。 保持标量类型但随后更改代码行以将对象转换为其整数值:
newEvent.attribute = [[packedData valueForKey:@"example"] integerValue];
编译器应该已经警告过你了!我本以为会看到类似 incompatible pointer to integer conversion assigning to 'int16_t' (aka 'short') from 'id _Nullable'
.