【问题标题】:CoreData convert NSNumbers to BOOLCoreData 将 NSNumbers 转换为 BOOL
【发布时间】:2013-04-07 09:14:38
【问题描述】:

我的 CoreData 模型中有一个实体,它有一个布尔字段。这以NSNumber 的形式存储在CoreData 实体中。我希望访问者使用BOOL 而不是NSNumber,所以我可以使用

comment.isActive = YES;

代替:

BOOL isCommentActive = [NSNumber numberWithBool:comment.isActive];

我打算更改自动生成的实体类文件中的代码,但我被告知不要这样做,因为每次提取模型时它都会覆盖。

我有一个实体类别,我尝试编写一个访问器,将其转换为同名的BOOL,但这只会导致我陷入循环。

有些人提到了方法 twizzling,但对我来说这听起来很 hacky。我应该只创建一个返回不同名称的原语的访问器吗?

【问题讨论】:

  • 现在相信你可以使用comment.isActive = @YES;

标签: ios core-data


【解决方案1】:

创建时只需选择“对原始数据类型使用标量属性”选项 Xcode 中的托管对象子类。这将创建属性

@interface MyEntity : NSManagedObject
@property (nonatomic) BOOL active;
@end

所有转换都是在“幕后”自动完成的。它实际上更多 高效,因为没有创建 NSNumber 对象。

不幸的是,“核心数据编程指南”已经过时了 对此,it still claims:

您可以将属性声明为标量值,但对于标量值 Core Data 不能动态生成访问器方法——你必须 提供您自己的实现。

我知道的唯一 Apple“文档”是 WWDC 2011 会议视频,比较 https://stackoverflow.com/a/14091193/1187415

【讨论】:

  • 马丁竞选总统!谢谢!
  • 我向 Apple 发送了错误报告
  • 所以,使用原始数据类型意味着我必须使用 NSTimeInterval 而不是 NSDate。有趣的。如果我想继续使用 NSDate,是否需要编写额外的访问器(如 getDate 和 setDate)?
  • @theDuncs:这可能是最干净的方式。
  • @theDuncs:您实际上可以在头文件中将属性的类型更改为 NSDate*,并在 .m 文件中将其保留为动态。唯一的缺点是当你再次生成文件时 Xcode 会覆盖它。
【解决方案2】:

我同意 Martin 的观点,但您可以尝试在现有的 NSManagedObject 子类中添加此函数:

 -(void)setActiveRaw:(BOOL)active
 {
     [self setActive:[NSNumber numberWithBool:active]];
 }

并像这样使用它:

 [comment setActiveRaw:YES];

而不是

 comment.active = [NSNumber numberWithBool:comment.isActive];

您也可以为此编写一个 getter:

 -(BOOL)getActiveRaw
 { 
    return [self.active boolValue]
 }

【讨论】:

  • 非常感谢。当我想获得价值时,这并没有太大帮助,但是您对设置是正确的。谢谢。
  • 没问题,我把getter函数给你。
  • 好的,但这是重命名属性,我不想这样做。还是谢谢。
  • 这并不完全是重命名,我们只是在编写一个自定义的 getter 和一个 setter,通过谈论我们知道的值(BOOL 类型)来处理核心数据值(NSNumber 类型)。而且我 100% 确定我没有重命名属性,我使用它来将 typeDef 类型属性存储在核心数据中。
  • 抱歉,我的意思是说我想要的是一对与 CoreData 实体上的属性同名的访问器。马丁的回答对我很有用。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 2015-04-17
  • 2017-02-24
  • 2010-10-17
  • 1970-01-01
相关资源
最近更新 更多