2011-03-22 115 views
3

我有一個可能愚蠢的問題關於一個潛在的愚蠢的數據庫設計。遞歸CoreData屬性

說我有這樣的設計(使用CoreData在iOS項目):

A類
- 名稱:NSString的
- 孩子:A類的的NSSet對象
- 父:A類對象

所以這是一個簡單的父/子設置。這很好。

現在,我想這樣做,以便如果A類對象沒有爲'name'定義值,則會搜索其父項,直到找到確定'name'的值並返回此值。

這是做一件棘手的事情,因爲我的自然反應來覆蓋名,吸氣這樣的:

- (NSString *)name 
{ 
    return name =! nil ? name : self.parent.name; 
} 

但是,這並不工作,因爲「名」通過自助進行訪問。因爲這是一個CoreData實體。

我那時做了一個名爲nameRecursive新方法,其工作方式的想法:

- (NSString *)nameRecursive 
{ 
    return self.name =! nil ? self.name : self.parent.name; 
} 

但這種感覺很笨重,不是很優雅(爲A類的現實生活版有哪些需要很多屬性像這樣工作),但我一直沒有想到更好的東西。

有沒有人有任何想法a)這是否是一個愚蠢的設計或b)我怎麼可能以優雅的方式解決它。

任何想法或想法都會很棒。提前致謝。

+1

您可能想重新考慮您的設計,因爲它會遮蔽對象。如果你在'name'上進行提取,你將得到所有解析爲那個名字的對象。相反,如果您走圖尋找名字,您將返回實際上沒有名字的第一個對象。我不確定你在找什麼邏輯,但你需要注意這些動態屬性。 – TechZen 2011-03-22 17:47:08

+0

感謝TechZen。我以驚人的態度接近這一點,因爲它打破了很多關於良好數據庫設計的想法,但它確實感覺像是適合我的工作。將看到它是如何變得有趣!希望我不後悔! – Mason 2011-03-23 05:02:03

回答

3

它看起來像以下問題可以幫助你實現第一種方法你提到

How can I override a getter on a property when using Core Data?

所以與其做

return name =! nil ? name : self.parent.name; 

你可以做類似的...

return [self primitiveValueForKey:@"name"] =! nil ? 
        [self primitiveValueForKey:@"name"] : self.parent.name; 

更新至回答評論中的查詢

Apple建議您不要這樣做。有關Managed Object Accessor Methods的信息,請參閱Apple文檔的「自定義屬性和一對一關係訪問器方法」部分。這提供瞭如何做到這一點適當的更詳細的(並鼓勵你不要。)也許你有很多,在完全相同的方式工作的屬性,你可以做一個方法,如

recursiveValueFor: (NSString*) property; 

能夠作爲行動不妨礙遞歸邏輯的通用包裝,同時不干擾CoreData動態屬性

+0

太棒了,非常感謝。一般來說,對於這是否應該做的事情有任何想法? – Mason 2011-03-22 15:04:43

+0

在上面更新中回答,因爲有更多的空間 – Dolbz 2011-03-22 15:25:45

+0

再次感謝Dolbz。你建議的處理很多物業的方式正是我打算做的。也感謝鏈接到Apple Docs。將閱讀和學習! – Mason 2011-03-22 15:32:27