我可以向 NSManagedObject 的子类的子类添加属性吗?
Posted
技术标签:
【中文标题】我可以向 NSManagedObject 的子类的子类添加属性吗?【英文标题】:Can I add properties to subclass of subclass of NSManagedObject? 【发布时间】:2015-01-29 09:18:41 【问题描述】:我有一个由核心数据生成的类Base : NSManagedObject
,为了给这个实体添加一些方法,我用Derived : Base
子类化了它。现在,我想将一个属性(不在Base
类中)添加到Derived
类。但是当我尝试访问添加属性的设置器时,它会引发异常:
caught "NSInvalidArgumentException", "-[Base setAddedProperty:]: unrecognized selector sent to instance 0x7fdcc31b36d0"
有人可以帮忙吗?
编辑:似乎 NSManagedObject 的子类的子类不能有自己的方法,因为我刚刚向Derived
添加了一个方法并得到了类似的异常。这是否意味着类别是向 NSManagedObject 的子类添加方法的唯一方法?
编辑:我将配置中实体的“类”更改为Derived
,现在一切正常。所有这些新添加的属性都可以访问,并且可以调用自定义方法。为什么?这是一个好习惯吗?
编辑:上面的描述似乎被误解了。我打算对核心数据生成的实体类进行子类化,以便提供自定义的方法和属性,而不是创建子实体。因此,Derived
不是数据模型中的实体。
【问题讨论】:
@Zhihhao L. 您是否尝试升级您的 .xcdatamodel?将新实体添加到 .xcdatamodel 后,您需要删除类并重新创建。 @СергейОлейнич 我没有更改数据模型。我刚刚生成了 NSManagedObject 的子类,并为这些生成的子类创建了一些子类。 @Zhihhao L. 你是否在模型中设置了继承复选框? @СергейОлейнич 不。但我的意图是对那些生成的实体类进行子类化,以提供一些自定义的属性和方法。不创建子实体。 @ZhihaoL。如果您不在核心数据模型中添加适当的字段,则无法存储额外的“派生”属性,但如果您为它们“合成”getter 和 setter(使用“@synthesize”关键字而不是“ @dynamic' 在实现文件中)。这样,核心数据将只保存数据模型(Base entity)中指定的属性,所有其他的将只存在从 fetch 到 fetch 【参考方案1】:您还应该在 xcdatamodel 中指定继承。检查字段:xcdatamodel 中的名称、类、父实体。 Derived : Base
对于 NSManagedObject
subclasses 来说是不够的。
【讨论】:
但是Derived
类不是子实体,而是打算成为Base
类的扩展。它的功能类似于类别,但我也想添加一些属性。【参考方案2】:
你需要选择父羊(也尝试为你设置抽象实体Base)
【讨论】:
但是Derived
不是一个实体,所以我在这个面板中找不到它。请查看编辑。【参考方案3】:
我已经解决了这个问题。
在我的 .xcdatamodeld 文件中,我将 Base
实体映射到 Base
类。在我的代码中,我通过以下方式创建了一个实例:
Derived* pointer = [Derived MR_createEntity];
此方法为我调用NSEntityDescriptor insertNewObjectForEntityForName:inManagedObjectContext
。但是,尽管指针的类型为Derived*
,但此方法将返回Base
的实例而不是Derived
,如果在编译中这应该是语法错误。
因此,为了使Derived
中的方法有效,我需要手动将映射从Base
更改为Derived
。
编辑: 写完这个答案,我发现了一个很棒的工具mogenerator,它使用了和我上面描述的完全一样的想法,真的很方便。
【讨论】:
以上是关于我可以向 NSManagedObject 的子类的子类添加属性吗?的主要内容,如果未能解决你的问题,请参考以下文章
无法通过 Swift 扩展向objective-c NSManagedObject 子类添加方法
当一对多相关的 NSManagedObject 子类发生更改时,如何更新 NSManagedObject 子类?
Xcode 和核心数据 - “创建 NSManagedObject 子类”