2012-02-11 63 views
10

我有一个NSManagedObject的子类,我想添加几个ivars来跟踪一些簿记。我不希望这些变量持续存在,所以这就是为什么我不将它们包含在数据模型中的一部分。将非持久变量添加到nsmangedobject

我很难找到正确的方法。

  • 我应该在我的课堂上创建ivars,创建相应的属性,然后在实现中综合它们?
  • 我不应该创建ivars,而只是声明属性,然后@dynamic属性中的implmentation?
  • 有没有其他方法我应该服用?

我应该做的事情在我的NSManagedObject子类所有的定制,或者我应该创建我的子类的子类,因此,如果我改变我的数据模型,我不会失去我的所有自定义设置,当我得到xcode自动生成我的NSManagedObject子类?

谢谢!

回答

9

NSManagedObject的每个属性都有一个名为瞬态的复选框。通过这种方式,您将拥有对象的动态访问器,而无需实际持久保存属性值本身。在属性名称条目的文本字段下找到复选框。

enter image description here

UPDATE如果您不希望创建新的,因为属性的迁移,使高德标准

@interface MyMO : NSManagedObject { 
    NSString *_nonPersistentAttribute; 
} 

@property (nonatomic, retain) NSString *nonPersistentAttribute; 

@end 

@implementation MyMO 

@synthesize nonPersistentAttribute=_nonPersistentAttribute; 

@end 
+0

对瞬态属性进行修改会将NSManagedObject标记为脏。有什么方法可以添加额外的变量而不会导致对象认为需要重新保存?我不需要撤消支持。谢谢 – 2012-02-11 20:36:55

+0

然后只需按照常规方式添加iVars和'@ synthesize'访问器。 – Eimantas 2012-02-12 07:37:38

+0

谢谢你提出两种选择。我已经成功地使用了第二次,但是现在只有当我尝试访问瞬态属性时,我才会得到“无法识别的选择器发送到实例”异常。任何想法? – 2013-05-29 12:16:58

1

这里是一个方便的模式我已经在过去使用:

创建您的课程的类别,并将其放入其他源文件,如ManagedObject+Support.h。请记住,在接口声明你只是用括号这样的:

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

通过这种方式,你可以改变周围的事物,而不必修改您的管理对象模型。 (更改MOM与重新填充的数据库,迁移等有许多问题)。当您更改模型时,您可以再次生成类文件,而不会丢失类别中的代码。

2

明智,

第一个问题回复:高德,你有两个选择标准的ivars或您的实体临时属性。两者之间的巨大差异在于瞬态属性参与了Core Data的更改/脏/撤消方面。如果你的ivars不需要,那么不要使用transient属性。 (是的,您的ivars使用@property@synthesize。)

回答第二个问题:在哪里做出更改?我有点笨拙。 Xcode自动生成的头文件模式非常简单。因此,我第一次使用自动生成的文件创建一个实体并在之后的修改中进行编辑。坦率地说,你不会经常更改你的模型数据结构。因此,在这两个地方添加几行文件并不是一个很大的代价.h & .m文件不是很大的代价。还有其他机制。沃尔夫Rentzch的mogenerator系统是很受尊重和有用的。也就是说,我不相信mogenerator可以解决现代Objective-C v2 Core Data程序员面临的问题。 (对象 - V2已经对核心数据的程序员做了许多事情变得更容易。)

安德鲁

10

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

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

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