iPhone:将布尔值保存到核心数据中

我已经build立了一个我的核心数据属性为布尔值。 现在,我需要设置它,但XCode一直告诉我,它可能不响应setUseGPS。

[ride setUseGPS: useGPS.on]; 

在核心数据中设置布尔值的方法是什么? 我所有的其他属性都是这样设置的,而且它们工作得很好。 所以,不知道为什么布尔值不能这样设置?

核心数据“没有”一个布尔types(它确实,但它是一个NSNumber)。

所以要设置相当于useGPS = YES。

 [entity setUseGPS:[NSNumber numberWithBool:YES]]; 

反过来说:

 BOOL isGPSOn = [[entity useGPS] boolValue]; 

更新:正如SKG所指出的那样,在Objetive-C中使用文字,现在可以以更简单的方式进行:

 [entity setUseGPS:@YES]; BOOL isGPSOn = entity.useGPS.boolValue; 

作为被接受的答案的替代方法,您可以简单地在托pipe对象接口定义中将input从NSNumber *更改为BOOL,例如:

 @property (nonatomic) BOOL useGPS; // Notice that the 'retain' is also removed as we're now dealing with a scalar rather than an NSObject 

这里讨论了各种各样的替代方法,但克里斯·汉森的回答对我来说是最有启发性的,特别是:

如果你有一个需要的数字属性(包括一个布尔属性),你可以直接input它作为一个标量,而核心数据将做正确的事情:

@property(nonatomic)BOOL isDone;

即使这个属性是可选的,它仍然可以工作,它只会将“不存在”与“错误”混为一谈。

并为更一致的cocoa实现:

另一件你可能想要做的事情是命名属性“完成”,只要指定getter为“isDone”。 这是通常的Cocoa命名约定:

@属性(nonatomic,getter = isDone)布尔完成;

然后你可以写“if(item.done){…}”或者“item.done = NO;” 编译器仍然会生成-isDone来访问属性。

感谢克里斯,并希望这可以帮助别人。

对于这个(“恕我直言,这是苹果的SDK中的错误)的”修复“是将以下代码添加到您的CoreData生成的类。 注意:如果你在一个类别中,在一个单独的文件中这样做,那么你不必在每次在Xcode中重新生成CoreData类时重新复制/粘贴它

 - (BOOL)useGPS { [self willAccessValueForKey:@"useGPS"]; BOOL myuseGPS = [[self primitiveUseGPS] boolValue]; [self didAccessValueForKey:@"useGPS"]; return myuseGPS; } - (void)setUseGPS:(BOOL)newValue { [self willChangeValueForKey:@"useGPS"]; [self setPrimitiveUseGPS:[NSNumber numberWithBool:newValue]]; [self didChangeValueForKey:@"useGPS"]; }