2012-02-11 50 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內的任何建模屬性或關係,否則您將遇到麻煩。