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"]; }