将 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'.

的警告