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作为默认值.
对于正在观看这个问题的人来说,只需将此注释放在这里一段时间,然后我将其删除.
根据文件,
您可以指定属性是可选的 - 也就是说,不需要具有值.但是,一般情况下,不鼓励您这样做 - 特别是对于数值(通常,您可以使用具有默认值的强制属性 - 在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.
如果您返回一个看起来像指针的大值,也许它是 NaN(不是数字)?
如果是这样,您可以检查:
isnan([[self numberAttribute] doubleValue])
Run Code Online (Sandbox Code Playgroud)
或者,它可能是类似于 NSNotFound 的其他常量(尽管可能更特定于核心数据)。
| 归档时间: |
|
| 查看次数: |
6526 次 |
| 最近记录: |