【问题标题】:CoreData entity with Boolean attribute being saved as an NSNumber object具有布尔属性的 CoreData 实体被保存为 NSNumber 对象
【发布时间】:2013-05-28 17:09:11
【问题描述】:

想知道是否有其他人遇到过这种情况,或者是否有原因而我做错了什么。

我有一个带有 CoreData 的应用程序。在架构中,我有一个“内容”实体,其“解锁”属性设置为布尔值。

但是,当我通过 Xcode 保存实体的 Obj C 类时,unlocked 在 content.h 中显示为:

@property (nonatomic, retain) NSNumber * unlocked;

如果我在 content.h 中将其更改为布尔值,则会收到 ARC 编译错误。但是,如果我在尝试获取它时将它保留为 NSNumber 对象,它会不一致地返回(就像我有一个 NSLog 打印它一样,每次运行时它都会以不同的值返回)。

我可以找到一个相当明显的解决方法,将 unlocked 作为 NSString 设置为“是”或“否”并在相关点进行比较,但我想知道是否有人知道为什么会发生这种情况,或者是否存在是将其保留为布尔值的方法。

提前致谢。

【问题讨论】:

  • 在Xcode中创建托管对象子类时可以选择"Use scalar properties for primitive data types"选项,然后你会得到@property (nonatomic) BOOL unlocked;

标签: ios core-data nsmanagedobject


【解决方案1】:

CoreData 存储对象,BOOL 不是。

[NSNumber numberWithBool:YES]

是设置属性的方式,可以通过阅读mybool = [content.unlocked boolValue];来使用

【讨论】:

  • 你也可以使用文字语法来设置布尔核心数据属性:object.boolAttribute = @YESobject.boolAttribute = @NO
  • 为解释干杯。 [content.unlocked boolValue] 成功了。
【解决方案2】:

BOOL 在 Core Data 中的存储方式类似于 NSNumbers(如果您查看 sqlite 表,您会发现它们存储为整数。因此,在存储和转换检索时NSNumberBOOL(或者只是我们原样 0/1)。

我没有看到任何不一致,但是 - 如果存储的 NSNumber 为零,则等于 NO,如果非零,则为 YES

【讨论】:

  • 认为我在获取它后错误地投射它,这导致了不一致。为帮助干杯。
猜你喜欢
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多