将非持久性变量添加到nsmanagedobject

时间:2012-02-11 19:29:59

标签: objective-c core-data nsmanagedobject

我有一个NSManagedObject的子类,我想添加几个ivars来跟踪一些簿记。我不希望这些变量持续存在,因此我不将它们作为数据模型的一部分包含在内。

我无法找到正确的方法。

  • 我应该在我的班级中创建ivars,创建相应的属性,然后在实现中合成它们吗?
  • 我应该不创建ivars,而只是声明属性,然后声明@dynamic属性中的属性?
  • 我应该采取其他方法吗?

我应该在我的NSManagedObject子类中进行所有自定义,还是应该创建子类的子类,这样如果我更改了我的数据模型,当我生成xcode时,我不会丢失所有自定义我的NSManagedObject子类是自动的吗?

谢谢!

4 个答案:

答案 0 :(得分:10)

NSManagedObject的文档有一个名为自定义实例变量的部分。它讨论了这两种方法。

瞬态,建模属性和ivars都是很好的解决方案。这取决于口味和风格。

如果您使用ivars,请记住一个非常重要点:您需要清除- (void)didTurnIntoFault中的ivars并在- (void)awakeFromFetch- (void)awakeFromInsert中设置任何初始值。您需要触摸-didTurnIntoFault内的任何建模属性或关系,否则您将遇到麻烦。

答案 1 :(得分:9)

NSManagedObject的每个属性都有一个名为 transient 的复选框。这样,您将拥有对象的动态访问器,而不会实际持久保存属性值本身。在文本字段下面找到属性名称条目的复选框。

enter image description here

更新如果您不想因新属性而创建迁移,请制作标准ivars

@interface MyMO : NSManagedObject {
    NSString *_nonPersistentAttribute;
}

@property (nonatomic, retain) NSString *nonPersistentAttribute;

@end

@implementation MyMO

@synthesize nonPersistentAttribute=_nonPersistentAttribute;

@end

答案 2 :(得分:2)

怀斯,

关于你的第一个问题:ivars,你的实体有两种选择标准的ivars或瞬态属性。两者之间的最大区别是瞬态属性参与Core Data的更改/脏/撤消方面。如果您的ivars不需要,请不要使用瞬态属性。 (是的,对您的ivars使用@property@synthesize。)

关于你的第二个问题:在哪里做出改变?我有点懒散。 Xcode自动生成的标题模式非常简单。因此,我第一次使用自动生成的文件创建实体,然后在我的更改中进行编辑。坦率地说,您不经常更改模型数据结构。因此,在这里和那里添加几行.h和.m文件并不是一个很大的成本。还有其他机制。 Wolf Rentzch的发电机系统备受推崇并且非常有用。也就是说,我不相信发电机解决了现代Objective-C v2核心数据程序员面临的问题。 (Obj-C v2为Core Data程序员提供了更多便利。)

安德鲁

答案 3 :(得分:1)

这是我过去使用过的一种方便的模式:

创建类的类别并将其放入其他源文件,例如ManagedObject+Support.h。请记住,在界面声明中,您只需使用这样的括号:

@interface ManagedObject (Support)
// declare your variables and methods
@end

通过这种方式,您无需修改​​托管对象模型即可更改内容。 (更改MOM在重新填充数据库,迁移等方面存在许多问题)。更改模型时,可以再次生成类文件,而不会丢失类别中的代码。