2010-04-23 79 views
1

我想使用我的自定义NSManagedObject就像一个普通的对象(以及它的常规函数​​)。是否有可能修改类以便能够像普通对象一样初始化它?iPhone - 更改实体类(NSManagedObject),使它们可初始化

[[myManagedObject alloc] init]; 

感谢

编辑:澄清的问题,将其拧一切,如果我在执行改变@dynamic与@synthesize?

回答

2

托管对象上下文是NSManagedObject的必需属性,因此您无法正确初始化它的实例而无需将其插入到上下文中。它看上下文来理解它的实体,并在其任何属性发生变化时通知上下文。

@dynamic和@synthesize只是编译器指令。只要你自己提供适当的getter和setter,你就可以从@dynamic切换到@synthesize。由于NSManagedObject严重依赖于键值观察功能,因此您必须编写符合KVO标准的访问器。

如果你需要初始化一个NSManagedObject子类,你可以覆盖awakeFromInsert,它可以让你在创建实例时提供自定义。您也可以在每次使用awakeFromFetch获取对象时自定义该对象。

+0

谢谢......现在看起来更清楚了!我想要做的是在持久存储之外使用这些类(如常规对象);这似乎是不可能的 – ncohen 2010-04-23 17:02:55

3

我经常在我的一个应用程序中这样做。我的方法是用下列方法初始化对象:

-(id)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(NSManagedObjectContext *)context 

传递nil作为上下文。要获取实体描述,您需要访问managedObjectContext。我倾向于在我的应用程序启动时获取实体描述,然后将其存储在我的应用程序委托中的实例变量中。

下面是一个例子:

//inside my "Engine" class 
self.tweetEntity = [NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:self.moc]; 

//later on when I want an NSManagedObject but not in a managed object context 
Tweet *tweet = [[[Tweet alloc] initWithEntity:self.engine.tweetEntity insertIntoManagedObjectContext:nil] autorelease]; 

这允许我使用NSManagedObjects没有将它们存储在数据库中。后来,如果我决定将对象插入到我的数据库中,我可以将它插入到托管对象上下文中:

[self.moc insertObject:tweet]; 
+0

问题是我的实体“元素”与实体“成分”有关系,当我尝试使用你的技术时,我尝试去做element.ingredient = anotherElement.ingredient。我得到一个错误:'非法尝试在不同情况下的对象之间建立关系'成分'' – ncohen 2010-04-25 12:39:36

+0

如果成分存储在托管对象上下文中,那么是的,你会遇到问题。如果成分也是用initWithEntity初始化的,那么它应该起作用。 – gotosleep 2010-04-25 18:14:56