3

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

comment.isActive = YES;

代替:

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

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

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

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

4

2 回答 2

12

在 Xcode 中创建托管对象子类时,只需选择“对原始数据类型使用标量属性”选项。这将创建属性

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

并且所有转换都是在“幕后”自动完成的。它实际上更有效,因为没有NSNumber创建对象。

不幸的是,“核心数据编程指南”在这方面已经过时了,它仍然声称

您可以将属性声明为标量值,但对于标量值,Core Data 不能动态生成访问器方法——您必须提供自己的实现。

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

于 2013-04-07T09:23:20.747 回答
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]
 }
于 2013-04-07T09:31:27.097 回答