核心数据将NSNumber转换为BOOL

时间:2013-04-07 09:14:38

标签: ios core-data

我的CoreData模型中有一个实体,它有一个布尔字段。它作为NSNumber存储在CoreData实体中。我想要的是访问者使用BOOL而不是NSNumber,所以我可以使用

comment.isActive = YES;

而不是:

BOOL isCommentActive = [NSNumber numberWithBool:comment.isActive];

我打算更改自动生成的实体类文件中的代码,但我被告知不要这样做,因为每次我提取模型时它都会覆盖。

我有一个实体的类别,我尝试编写一个访问器,将其转换为同名的BOOL,但这只会导致我陷入循环。

有些人提到方法眩晕,但这对我来说听起来很神奇。我应该创建一个返回不同名称原语的访问器吗?

2 个答案:

答案 0 :(得分:12)

创建时,只需选择“使用基本数据类型的标量属性”选项即可 Xcode中的托管对象子类。这将创建属性

@interface MyEntity : NSManagedObject
@property (nonatomic) BOOL active;
@end

并且所有转换都在“引擎盖下”自动完成。实际上更多 效率很高,因为没有创建NSNumber个对象。

不幸的是,“核心数据编程指南”已经过时了 对此,it still claims

  

您可以将属性声明为标量值,但标量值   核心数据无法动态生成访问器方法 - 您必须这样做   提供自己的实现。

我所知道的唯一Apple“文档”是WWDC 2011会话视频,比较https://stackoverflow.com/a/14091193/1187415

答案 1 :(得分:0)

我同意Martin,但您可以尝试在现有的NSManagedObject子类中添加此函数:

 -(void)setActiveRaw:(BOOL)active
 {
     [self setActive:[NSNumber numberWithBool:active]];
 }

并像这样使用它:

 [comment setActiveRaw:YES];

而不是

 comment.active = [NSNumber numberWithBool:comment.isActive];

你也可以为此写一个吸气剂:

 -(BOOL)getActiveRaw
 { 
    return [self.active boolValue]
 }