将NSDictionary值保存到核心数据的问题

时间:2018-02-21 12:18:34

标签: objective-c core-data nsdictionary

注意:请在使用或关闭之前完整阅读该问题。

我有一个字典packedData,其中NSNumber类型&的值为'1'。关键的“例子”。我将此值保存为核心数据

myentity.attribute = [packedData valueForKey:@"example"];  //attribute is of NSNumber type as well.

当我获取数据时,返回的值是“23008”或其他一些不相关的值。我对其进行了调试,发现在将其保存到核心数据时,这是一个价值转换问题。

有谁知道为什么会这样或者它的解决方案?

更新:NSString和NSDate类型保存得很好(与字典中的确切值一样)。

1 个答案:

答案 0 :(得分:0)

如果你有"使用标量属性"为整数类型属性选择,生成的代码类似于

@property (nonatomic) int16_t attribute;

如果取消选中,代码看起来像

@property (nullable, nonatomic, copy) NSNumber *attribute;

第一种情况是原始整数类型;第二个是核心数据将视为包含整数的NSNumber对象。

您的代码行如下所示:

myentity.attribute = [packedData valueForKey:@"example"];

valueForKey调用将返回一个对象,在您的情况下为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'之类的警告。