2010-08-25 16 views
2

我創建了自己的類,我想核心數據,而不是使用NSManagedObject我如何使所有核心數據對象從我的類而不是NSManagedObject繼承?

@interface MyManagedObject: NSManagedObject { 
    id delegate; 
} 

我不能用一個類別,因爲這個聲明伊娃。我所有的Core Data對象都使用具體的類而不是NSManagedObject的實例。我使用代碼生成器來生成這些文件。這裏是一個什麼樣的Contact對象可能看起來像一個例子:

@interface Contact: NSManagedObject { 
} 

我知道我可以手動更改NSManagedObjectMyManagedObject這個生成的代碼,但我需要這個我重新生成代碼都必須這樣做。有沒有辦法讓它自動使用我自己的類?

此外,在任何解決方案中的#import可能是一個問題。理想情況下,我希望它使用@class MyManagedObject而不是#import "MyManagedObject.h",因爲MyManagedObject.h位於庫中,並且標頭需要可訪問的文件夾前綴(例如#import "MyLib/MyManagedObject.h")。


我試圖在.xcdatamodel文件具有相同的名稱創建一個虛擬對象,並指定所有對象繼承它,但有兩個問題。首先是它使用#import "MyManagedObject.h",由於我上面指定的原因,它找不到。第二個問題是,我不確定將Core Data愚弄到認爲類是從另一個Core Data對象繼承的是一個好主意......即使我沒有生成代碼文件。我猜Core Data可能會在幕後做一些不必要的事情,因爲它認爲有一個額外的類是我的類繼承的。

我想我可以使用另一層類來解決第一個問題。例如,我將指定對象從MyProjectManagedObject繼承和在我的項目創建一個MyProjectManagedObject.h文件:

#import "MyLib/MyManagedObject.h" 

@interface MyProjectManagedObject: MyManagedObject { 
} 

...現在我的自動生成的文件看起來像這樣:

#import "MyProjectManagedObject.h" 

@interface Contact: MyProjectManagedObject { 
} 

。 ..將工作。唯一的問題是我上面提到的第二個關於在Core Data幕後運行的額外代碼。這是有些擔心或應該忽略嗎?有沒有其他方法可以解決上述兩個問題?

回答

1

看看MOGenerator。它至少可以幫助重新生成託管對象類文件:它會爲每個文件創建兩個文件。一個是你編輯的,一個是自動生成的。當你重新生成後者時,前者不變。

http://digitalflapjack.com/blog/2010/mar/26/mogeneratorftw/

+1

如果您使用' - -base MyManagedObject'命令行參數。 – Senseful 2010-08-25 06:47:34

2

如果您使用SQL後端,請不要在數據模型中使用繼承。由於SQL後端的實現,它具有可怕的性能和空間特性。 (這是蘋果的建議。)

我可能是錯的(我會仔細檢查),但我認爲你可以只使用類和頭文件來做你想做的事情,而不會搞亂數據模型。 (這是假設你不想實際將你的ivar存儲在數據後端。)只需像你那樣實施MyManagedObject,並使MyManagedObject而不是NSManagedObject(例如Contact : MyManagedObject)固有的子類。 請注意,您只需在頭文件中執行此操作,而不是實際的數據模型。編譯器應該找出其餘的。

+0

您是否有Apple提供的建議鏈接?另外,伊娃不需要在後端。這正是我原來所做的,我修改了'.h'文件以使其從正確的類繼承。每次重新生成.h文件(即每次更改模型時)都必須這樣做,這很煩人。這就是我尋找其他解決方案的原因。 – Senseful 2010-08-25 04:17:10

+0

該建議是在「使用核心數據」開發人員視頻(https://deimos.apple.com/WebObjects/Core.woa/BrowsePrivately/adc.apple.com.3391495696.03391495702) – shosti 2010-08-25 07:26:39

相關問題