Core Data实体中布尔属性的类型是什么?

时间:2009-06-20 19:10:14

标签: objective-c cocoa core-data

我以编程方式使用Core Data(即不使用.xcdatamodel数据模型文件),其方式与Apple Core Data Utility Tutorial中描述的方式大致相同。所以我的问题是,当我尝试将属性添加到类型为NSBooleanAttributeType的实体时,它会有点错误。当我将它添加到我的NSManagedObject子类头文件(在教程中,那将是Run.h

@property (retain) BOOL *booleanProperty;

编译失败,说error: property 'booleanProperty' with 'retain' attribute must be of object type

似乎Cocoa中的某些地方使用NSNumber个对象来代表布尔值,所以我尝试将其设置为

@property (retain) NSNumber *booleanProperty;

代替。但是,这会引起以下运行时错误:

*** -[NSAttributeDescription _setManagedObjectModel:]: unrecognized selector sent to instance 0x101b470
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSAttributeDescription _setManagedObjectModel:]: unrecognized selector sent to instance 0x101b470'

使用GDB,我能够将其追溯到源代码中的行,我将实体添加到托管对象模型中:

[DVManagedObjectModel setEntities:[NSArray arrayWithObjects:myEntityWithABooleanAttribute, myOtherEntity]];

所以我的问题是:我应该在自定义类标题中将booleanProperty设置为什么类型?

8 个答案:

答案 0 :(得分:18)

尝试:

@property (nonatomic) BOOL booleanProperty;

问题是您在属性定义中使用了retain。为此,您必须拥有Objective-C类的属性(它应该能够理解'retain'方法)。 BOOL不是类,而是signed char的别名。

答案 1 :(得分:18)

我不推荐Diederik Hoogenboom建议的方法(即使我的核心数据属性设置为布尔值,我也会收到错误)。

值得指出的是,尽管这一行适用于自定义对象,但它不适用于NSManagedObject的子类:

@property (nonatomic) BOOL booleanProperty;

您的财产应设为:

@property (nonatomic, retain) NSNumber *booleanProperty;

当我复制布尔类型的方法声明时(使用Jim Correia建议的技术),getter和setter被输入为:

NSNumber:-(NSNumber *)booleanProperty; 
-(void)setBooleanProperty:(NSNumber *)value;

...这就是将核心数据中的布尔属性设置为,并且您需要使用以下内容验证您的属性:

-(BOOL)validateBooleanProperty:(NSNumber **)toValidate error:(NSError **)outError 
{
    int toVal = [*toValidate intValue];

    if ( (toVal < 0) || (toVal > 1) )
    {
        NSString *errorString = NSLocalizedStringFromTable(@"Boolean Property", @"TheObject", @"validation: not YES or NO");
        NSDictionary *userInfoDict = [NSDictionary dictionaryWithObject:errorString forKey:NSLocalizedDescriptionKey];

        NSError *error = [[[NSError alloc] initWithDomain:NSCocoaErrorDomain code:-1 userInfo:userInfoDict] autorelease];
        *outError = error;
        return NO;
    }
    return YES;
}//END

...记得在头文件中包含validateBooleanProperty声明。 setter和getter方法使用 - (id)primitiveValueForKey:(NSString *)键存储和检索属性。

最后,您需要从您设置对象的任何视图控制器/应用程序委托中显式调用validate方法:

    NSNumber *boolProp = [[[NSNumber alloc] initWithInt :0] autorelease];
    NSError *valError = nil;        
    if ([TheObject validateBooleanProperty:&boolProp error:&valError] == YES)
    {
        [TheObject setBooleanProperty :boolProp];   
    }       

答案 2 :(得分:15)

在标题中,

@property (nonatomic, retain) NSNumber *booleanProperty;

在实施中,

@dynamic booleanProperty;

将其设为真......

self.booleanProperty = [NSNumber numberWithBool:YES];

将其设为false ...

self.booleanProperty = [NSNumber numberWithBool:NO];

将它与文字真实布尔值进行比较:...

self.booleanProperty.boolValue == YES;

将它与文字假布尔值进行比较:...

self.booleanProperty.boolValue == NO;

有关详细信息:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nsnumber_Class/Reference/Reference.html#//apple_ref/occ/clm/NSNumber/numberWithBool

答案 3 :(得分:6)

在NSManagedObject子类中生成正确访问器的最佳方法之一是在数据建模工具中调出属性或属性的上下文菜单,然后选择以下命令之一:

  • 将方法声明复制到剪贴板
  • 将方法实施复制到剪贴板
  • 将Obj-C 2.0方法声明复制到剪贴板
  • 将Obj-C 2.0方法实现复制到剪贴板

答案 4 :(得分:4)

让Xcode 4.0为您决定。 在Xcode中:从* .xcdatamodel文件视图中选择一个实体 选择编辑器&gt;创建NSMagedObject子类... Xcode将您的Boolean对象声明为NSNumber类型。

编辑:我很好奇缓解xcdatamodel的动机是什么?任何人吗?

答案 5 :(得分:3)

NSManagedObject中类型为Boolean的属性的类型为NSCFBoolean。这是NSNumber的私有子类。

答案 6 :(得分:2)

我不知道这只是你的错字,但是这个:

[NSArray arrayWithObjects:myEntityWithABooleanAttribute, myOtherEntity]

绝对是错的。该方法的最后一个参数应该始终为零。

答案 7 :(得分:1)

使用NSNumber。 CoreData框架中没有bool。