在我的核心数据模型中,我有一个可选的NSNumber属性的实体。
如何测试,看看是否在属性的值是否有效?
当我测试零...不起作用。
[self numberAttribute] == nil // always returns NO
当我测试零值INT,不起作用。
[[self numberAttribute] intValue] == 0 // always returns no
作为事实上,[自numberAttribute]的intValue]回报的东西,看起来很像一个指向一个内存地址。
任何人有任何想法,我做错了什么?
编辑:好的,这个bug是在代码中的一个完全无关的部分。 的NSNumber和核心数据正在运作完全按照人们所期望的。 这就是说,我会去与制作属性不可选的,0指定为默认值的建议的方法。
只是把这个说明此处为一小会儿的人谁在看这个问题,那么我将其删除。
根据该文件 ,
你可以指定一个属性是可选的,也就是说,有一个值不是必需的。 但一般情况下,你这样做,尤其是对数值气馁(通常你使用强制属性具有缺省值,在模型的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。
如果你得到一个较大的值返回,看起来像一个指针,也许这是NaN(非数字)?
如果是这样,你可以检查有:
isnan([[self numberAttribute] doubleValue])
或者可能是沿着NSNotFound的线其他一些常数(虽然可能更多的核心数据专用)。
如果它看起来像一个指针,它可能是一个指针NSNumber
实例。 确保你没有核心数据模型和类之间的错配(例如NSInteger
地方NSNumber*
预计)。
如果你在你的类有标量,那么你需要注意的是自己setNilValueForKey: