在核心数据中存储可选的NSNumber

mmc*_*mmc 7 iphone cocoa-touch core-data objective-c nsnumber

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

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

当我测试为零时......不起作用.

[self numberAttribute] == nil // always returns NO
Run Code Online (Sandbox Code Playgroud)

当我测试零值int时,这不起作用.

[[self numberAttribute] intValue] == 0  // always returns no
Run Code Online (Sandbox Code Playgroud)

事实上,[[self numberAttribute] intValue]]返回一些看起来像是指向内存地址的指针.

任何人都知道我做错了什么?

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

对于正在观看这个问题的人来说,只需将此注释放在这里一段时间,然后我将其删除.

Don*_*Don 5

根据文件,

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

false == (NULL == 0)
false == (NULL != 0)
Run Code Online (Sandbox Code Playgroud)

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

false == (NULL == @"")
false == (NULL != @"")
Run Code Online (Sandbox Code Playgroud)

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

编辑:请参阅上面的评论.我尝试创建一个未设置可选属性的新托管对象,它是零.

BOOL isNil = ([newManagedObject numberAttribute] == nil);  //equals YES
Run Code Online (Sandbox Code Playgroud)

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


Ken*_*ner 0

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

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

 isnan([[self numberAttribute] doubleValue])
Run Code Online (Sandbox Code Playgroud)

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