【问题标题】:Core Data and BOOL setup核心数据和 BOOL 设置
【发布时间】:2011-02-20 11:42:01
【问题描述】:

我正在开发一个使用 Core Data 作为后端来管理 SQLite 记录的应用程序。我可以处理字符串和数字的所有内容,但刚刚尝试添加 BOOL 字段,但似乎无法正常工作。

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

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

@property (nonatomic, retain) NSNumber * isCurrentlyForSale;

随着

@dynamic isCurrentlyForSale;

在 .m 实现文件中。

我一直将布尔值用作简单的 BOOL。我读过我可以使用 NSNumber 的 numberWithBoolboolValue 方法,但是对于如此简单的事情来说,这似乎是一大堆额外的代码。

可以将标头中的@property 更改为简单的BOOL 吗?如果有,有什么要注意的吗?

谢谢 -约翰

【问题讨论】:

    标签: iphone core-data ipad


    【解决方案1】:

    简单回答:不,您不能将@property 声明更改为返回BOOL

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

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

    【讨论】:

    • setter 或属性中不应包含“is”。这就是@property 具有getter= 设置的原因。是的,您可以使用 Core Data 中的原始访问器将 @property 更改为 BOOL。
    • @Marcus 是的,我知道二传手不应该有Is,但我把它放进去是因为setCurrentlyForSale: 已经被CD 带走了(而且我知道getter=setter=。你是说只需将标题中的NSNumber * 更改为BOOL 就可以了?那绝对会让我感到惊讶。
    【解决方案2】:

    虽然 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 啊,我明白你现在在说什么了。我以为您是在暗示您可以将 @property 更改为 BOOL 并且不实现自定义方法。顺便说一句,二传手稍微不正确。 (will|did)ChangeValueForKey: 应该只在新值实际上不同时才被调用(即,您需要一个 if 语句)。
    • 我唯一要补充的是,我喜欢使用 NSString 常量作为键名,这样可以避免以后遇到排版错误。 NSString *const CurrentlyForSale = @"currentlyForSale";
    猜你喜欢
    • 2011-01-11
    • 2011-04-09
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多