8

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

如何测试该属性中的值是否有效?

当我测试 nil 时......不起作用。

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

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

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

事实上,[[self numberAttribute] intValue]] 返回的东西看起来很可疑,就像一个指向内存地址的指针。

有人知道我做错了什么吗?

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

只是把这个笔记放在这里,给任何正在看这个问题的人,然后我删除它。

4

3 回答 3

5

根据文件

您可以指定一个属性是可选的——也就是说,它不需要有一个值。但是,通常不鼓励您这样做,尤其是对于数值(通常,您可以使用具有默认值(在模型中)为 0 的强制属性获得更好的结果)。原因是 SQL 对 NULL 有特殊的比较行为,这与 Objective-C 的 nil 不同。数据库中的 NULL 与 0 不同,搜索 0 将不会匹配具有 NULL 的列。

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

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

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

因此,尝试使用 NULL 进行测试,它不是 nil。更好的是,设置默认值并将属性更改为非可选。这就是我最终在我的模型中所做的,并且在实践中效果很好。

编辑:见我上面的评论。我尝试创建一个未设置可选属性的新托管对象,结果为零。

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

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

于 2009-07-27T15:41:44.800 回答
0

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

如果您的班级中有标量,那么您需要注意自己在setNilValueForKey:.

于 2009-07-27T15:56:03.210 回答
0

如果你得到一个看起来像指针的大值,也许它是 NaN(不是数字)?

如果是这样,您可以检查:

 isnan([[self numberAttribute] doubleValue])

或者,它可能是一些其他类似于 NSNotFound 的常量(尽管可能更特定于核心数据)。

于 2009-07-27T15:28:14.903 回答