核心数据原始访问器

Posted

技术标签:

【中文标题】核心数据原始访问器【英文标题】:Core Data Primitive Accessors 【发布时间】:2011-05-19 11:06:08 【问题描述】:

我有点困惑,Core Data 是否以 setPrimitiveAttributeName: 形式为 NSManagedObject 子类生成原始访问器,而与它似乎始终如一的形式 setPrimitiveValue: forKey: 相比。

我困惑的根源是我使用建模工具 (XCode 4) 为我的两个实体生成 NSManagedSubclasses,据我所知,它们共享相同的元数据设置,但一个子类识别 setPrimitiveAttributeName形式,而另一个没有(它给了我一个“找不到方法”编译器警告)。

那么,期望是什么?如果我打开一个新项目,创建一个具有一个属性的实体,并使用建模工具生成必要的 NSManagedObject 子类代码,我是否应该期望它自动生成更有效的原始访问器形式?

【问题讨论】:

【参考方案1】:

我也遇到过类似的问题。虽然运行时generates the primitive accessors,Xcode 4 不会为原语生成声明的属性,但您必须根据文档在子类中自己执行此操作。

我亲自为每个实体创建一个类别,并始终将我的自定义代码放在那里,这样我就可以随时重新生成 MO,而不必复制和粘贴。

你可以在一个类别中这样做,界面有这个:

@property (nonatomic, retain) NSDate * primitiveLastUsed;

而实现是这样的:

@dynamic primitiveLastUsed;

非常漂亮,让从 Xcode 重新生成 MO 变得轻松。

【讨论】:

这里是链接文档中最相关的一点:“Core Data 自动为您生成访问器方法(和原始访问器方法)......但是您确实需要声明访问器方法或使用目标-C 属性来抑制编译器警告。" 作为旁注,与其创建我自己的类别,我在这种情况下所做的是使用 rentzsch.github.io/mogenerator 。 mogenerator 根据模型自动生成基类。然后你在一个子类中扩展它。生成的基类比普通的 Xcode 类要全面得多。仅一个示例就是头文件自动包含所有原始访问器的声明(如本问题所述)。但这也意味着您可以在更改模型时重新生成这些基类,而不会影响您的自定义代码。 是的,这是一个很棒的工具,我的解决方案是针对那些想要这种行为而不需要辅助工具的人。感谢您链接这个!

以上是关于核心数据原始访问器的主要内容,如果未能解决你的问题,请参考以下文章

自定义核心数据访问器——setValue:forKey: vs. setPrimitiveValue:forKey:

Core Data 无法生成原始访问器

核心数据访问器 - 删除前

CoreData - 原始访问器作为属性?

如何使用核心数据的添加和删除(NSSet)访问器方法?

核心数据:我应该为每个实体编写一个数据访问对象/管理器/控制器吗?