核心数据和BOOL设置

时间:2010-05-17 15:46:32

标签: iphone core-data ipad

我正在开发一个使用Core Data作为管理SQLite记录后端的应用程序。我有一切都在处理字符串和数字,但刚刚尝试添加BOOL字段,似乎无法让事情发挥作用。

在.xcdatamodel中,我在我的对象中添加了一个名为isCurrentlyForSale的字段,该字段不是可选的,不是Transient,也不是Indexed。属性的类型设置为布尔值,默认值为NO。

当我从数据模型创建类文件时,.h标题中为此属性添加的样板代码为:

@property (nonatomic, retain) NSNumber * isCurrentlyForSale;

一起
@dynamic isCurrentlyForSale;
<。>在.m实现文件中。

我一直使用布尔值作为简单的BOOL。我已经读过,我可以使用NSNumber的numberWithBoolboolValue方法,但这似乎是一个非常简单的额外代码。

标题中的@property可以更改为简单的BOOL吗?如果有,有什么值得注意的吗?

由于 -John

2 个答案:

答案 0 :(得分:30)

虽然Dave DeLong的回答很接近,但您实际上可以这样做,而无需更改属性的名称。

可以更改属性以返回BOOL,但您需要手动编写访问器方法,它们与Dave在响应中的内容略有不同。

首先,您的@property应定义为:

@property (nonatomic, getter=isCurrentlyForSale) BOOL currentlyForSale;

然后在您的实现文件中,不是声明@dynamic属性,而是直接创建访问者。

- (BOOL)isCurrentlyForSale
{
  [self willAccessValueForKey:@"currentlyForSale"];
  BOOL b = [[self primitiveValueForKey:@"currentlyForSale"] boolValue];
  [self didAccessValueForKey:@"currentlyForSale"];
  return b;
}

- (void)setCurrentlyForSale:(BOOL)b
{
  [self willChangeValueForKey:@"currentlyForSale"];
  [self setPrimitiveValue:[NSNumber numberWithBool:b] forKey:@"currentlyForSale"];
  [self didChangeValueForKey:@"currentlyForSale"];
}

使用这些访问器,您的对象将为您处理装箱,您可以将其作为原始值访问。另外,以setIs开头的setter不是一个好主意,因此在示例代码中将其删除。

答案 1 :(得分:2)

简单回复:不,您无法更改@property声明以返回BOOL

但是你可以编写一些简单的包装器。我将属性重命名为currentlyForSale(这意味着它生成currentlyForSalesetCurrentlyForSale:),然后编写两个包装器:

- (BOOL) isCurrentlyForSale {
  return [[self currentlyForSale] boolValue];
}

- (void) setIsCurrentlyForSale:(BOOL)forSale {
  [self setCurrentlyForSale:[NSNumber numberWithBool:forSale]];
}