2010-04-23 65 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