-->

在核心数据存储可选的NSNumber(Storing optional NSNumber in Co

2019-09-21 02:05发布

在我的核心数据模型中,我有一个可选的NSNumber属性的实体。

如何测试,看看是否在属性的值是否有效?

当我测试零...不起作用。

[self numberAttribute] == nil // always returns NO

当我测试零值INT,不起作用。

[[self numberAttribute] intValue] == 0  // always returns no

作为事实上,[自numberAttribute]的intValue]回报的东西,看起来很像一个指向一个内存地址。

任何人有任何想法,我做错了什么?

编辑:好的,这个bug是在代码中的一个完全无关的部分。 的NSNumber和核心数据正在运作完全按照人们所期望的。 这就是说,我会去与制作属性不可选的,0指定为默认值的建议的方法。

只是把这个说明此处为一小会儿的人谁在看这个问题,那么我将其删除。

Answer 1:

根据该文件 ,

你可以指定一个属性是可选的,也就是说,有一个值不是必需的。 但一般情况下,你这样做,尤其是对数值气馁(通常你使用强制属性具有缺省值,在模型的0可以得到更好的结果)。 这样做的原因是,SQL有NULL比较特殊的行为不像Objective-C的零。 NULL在数据库中是不一样的0和0的搜索将不会与NULL匹配列。

false == (NULL == 0)
false == (NULL != 0)

此外,NULL在数据库中不等于空字符串或空数据blob,或者:

false == (NULL == @"")
false == (NULL != @"")

因此,尝试用NULL测试,这是不为零。 更妙的是,设置默认并更改属性是不可选的。 这就是我已经结束了在我的模型做的,并在实践中它工作得很好。

编辑:见我的上述评论。 我试图用一个可选属性未设置创建一个新的管理对象,它是零。

BOOL isNil = ([newManagedObject numberAttribute] == nil);  //equals YES

另一个编辑:我回来稍后,并检查了在调试器缓存加载的对象(GDB是你的朋友!)。 有人试图访问内存的0x0位置,这是NULL。



Answer 2:

如果你得到一个较大的值返回,看起来像一个指针,也许这是NaN(非数字)?

如果是这样,你可以检查有:

 isnan([[self numberAttribute] doubleValue])

或者可能是沿着NSNotFound的线其他一些常数(虽然可能更多的核心数据专用)。



Answer 3:

如果它看起来像一个指针,它可能是一个指针NSNumber实例。 确保你没有核心数据模型和类之间的错配(例如NSInteger地方NSNumber*预计)。

如果你在你的类有标量,那么你需要注意的是自己setNilValueForKey:



文章来源: Storing optional NSNumber in Core Data