2009-07-27 52 views
6

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

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

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

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

当我测试一个零值int,这是行不通的。

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

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

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

编辑:好的,错误是在代码完全不相关的部分。 NSNumber和Core Data的功能完全符合人们的预期。也就是说,我将采用建议的方法,将属性设置为非可选,并将0指定为默认值。

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

+1

我还没有足够的代表编辑,但你的第二个代码示例有不平衡的括号(2个开括号和3个关闭)。 – Mark 2009-07-27 14:30:15

+0

非常感谢。固定。 – mmc 2009-07-27 15:18:10

+0

numberAttribute在数据模型中被指定为浮点数? 如何声明numberAttribute属性?他们的访问器实现是什么样的(如果你不使用@dynamic访问器)。 没有这些信息,你的问题是不可能准确回答的。 – 2009-07-27 15:51:20

回答

0

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

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

isnan([[self numberAttribute] doubleValue]) 

,或者可能是沿着NSNotFound的线(尽管可能更核心数据特定的)一些其他不变。

5

按照documentation

您可以指定一个属性是可选的,也就是说,有一个值不是必需的。但是,通常情况下,您不鼓励这样做 - 特别是对于数值(通常您可以使用具有默认值的强制属性(在模型中为0)获得更好的结果)。其原因是SQL对NULL有特殊的比较行为,这与Objective-C的nil不同。数据库中的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。

0

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

如果你在班上有标量,那么你需要注意自己在setNilValueForKey: