我有一个NSManagedObject的子类,我想添加几个ivars来跟踪一些簿记。我不希望这些变量持续存在,因此我不将它们作为数据模型的一部分包含在内。
我无法找到正确的方法。
我应该在我的NSManagedObject子类中进行所有自定义,还是应该创建子类的子类,这样如果我更改了我的数据模型,当我生成xcode时,我不会丢失所有自定义我的NSManagedObject子类是自动的吗?
谢谢!
答案 0 :(得分:10)
NSManagedObject
的文档有一个名为自定义实例变量的部分。它讨论了这两种方法。
瞬态,建模属性和ivars都是很好的解决方案。这取决于口味和风格。
如果您使用ivars,请记住一个非常重要点:您需要清除- (void)didTurnIntoFault
中的ivars并在- (void)awakeFromFetch
和- (void)awakeFromInsert
中设置任何初始值。您需要不触摸-didTurnIntoFault
内的任何建模属性或关系,否则您将遇到麻烦。
答案 1 :(得分:9)
NSManagedObject
的每个属性都有一个名为 transient 的复选框。这样,您将拥有对象的动态访问器,而不会实际持久保存属性值本身。在文本字段下面找到属性名称条目的复选框。
更新如果您不想因新属性而创建迁移,请制作标准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在重新填充数据库,迁移等方面存在许多问题)。更改模型时,可以再次生成类文件,而不会丢失类别中的代码。