iPhone:将布尔值保存到Core Data中

Nic*_*ard 53 iphone boolean core-data uiswitch

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

[ride setUseGPS: useGPS.on];
Run Code Online (Sandbox Code Playgroud)

在核心数据中设置布尔值的方法是什么?我所有其他属性都以这种方式设置,并且它们运行良好.那么,不确定为什么布尔值无法以这种方式设置?

Ric*_*kiG 133

核心数据"没有"布尔类型(确实如此,但它是一个NSNumber).

所以要设置useGPS = YES的等价物.

[entity setUseGPS:[NSNumber numberWithBool:YES]];
Run Code Online (Sandbox Code Playgroud)

反过来说:

BOOL isGPSOn = [[entity useGPS] boolValue];
Run Code Online (Sandbox Code Playgroud)

更新: 正如SKG所指出的,使用Objetive-C中的文字,您现在可以更简单的方式完成:

[entity setUseGPS:@YES];

BOOL isGPSOn = entity.useGPS.boolValue;
Run Code Online (Sandbox Code Playgroud)

  • 您也可以像这样设置值:`object.isGPSOn = @YES;` (9认同)

pau*_*ore 18

作为接受答案的替代方法,您只需在管理对象接口定义中将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
Run Code Online (Sandbox Code Playgroud)

这里讨论了各种替代方法,但Chris Hanson的回答对我来说最为启发,特别是:

如果你有一个必需的数字属性(包括一个布尔属性),你只需键入它作为标量,Core Data将做正确的事情:

@property(非原子)BOOL isDone;

即使该属性是可选的,它仍然可以工作 - 它只会将"不存在"与"错误"混为一谈.

以及更加一致的Cocoa实现:

您可能想要做的另一件事是将属性命名为"done",并将getter指定为"isDone".这是通常的Cocoa命名约定:

@property(nonatomic,getter = isDone)BOOL完成;

然后你可以写"if(item.done){...}"或"item.done = NO;" 并且编译器仍然会为属性的访问生成-isDone.

谢谢克里斯,并希望这有助于某人.

  • 据我所知,这不适用于NSManagedObject子类. (2认同)