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

时间:2010-05-30 08:15:12

标签: iphone core-data boolean uiswitch

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

[ride setUseGPS: useGPS.on];

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

4 个答案:

答案 0 :(得分:133)

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

所以设置useGPS = YES的等价物。

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

反过来说:

BOOL isGPSOn = [[entity useGPS] boolValue];

<强>更新 正如SKG所指出的,使用Objetive-C中的文字,你现在可以用更简单的方式来实现:

[entity setUseGPS:@YES];

BOOL isGPSOn = entity.useGPS.boolValue;

答案 1 :(得分: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

讨论了各种替代方法here,但Chris Hanson的反应对我来说最为启发,尤其是:

  

如果您有数字属性   (包括布尔属性)即   必需的,你可以输入它作为   相反,标量和Core Data会做   正确的事:

     

@property(nonatomic)BOOL isDone;

     

即使该属性是可选的,   这仍然有用 - 它只是   将“不存在”与“虚假”混为一谈。

以及更加一致的Cocoa实现:

  

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

     

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

     

然后你可以写“if(item.done){   ...}“或”item.done = NO;“和   编译器仍会生成-isDone   访问该物业。

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

答案 2 :(得分:2)

仅是对@RickiG答案的补充,从NSNumber创建Bool的方法(反之亦然)(至少从v4.2起)是:

let nsNumberFromBool = NSNumber(booleanLiteral: true) // or false
let boolFromNSNumber = nsNumberFromBool.boolValue

答案 3 :(得分:0)

对此的“修复”(恕我直言,这是Apple的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"];
}