2

Im新的CoreData,並有相對較好的保留,除了現在我開始看關係,需要一點幫助。核心數據關係使用

在我的應用程序中的一個問題讓我想起它,我有兩個實體,TableInfo和PersonInfo。

桌子上可以坐着很多人,但一個人只能坐在一張桌子上。所以我知道在這方面這將是一對多的關係,並且它也具有現實世界的意義。

無論如何,在我的應用程序中,我添加了一個表給我的人,所以我基本上說,這個人坐在這張桌子上。但是,如果我再去刪除已經提供給某人的表格,該如何處理?

我認爲人際關係可能會在這裏發揮作用,但我從來沒有與他們合作過,所以我很難理解到哪裏去。

如果有人知道任何有助於解決此問題或詳細核心數據關係的優秀教程,或者您可以提供幫助,我將非常感激,謝謝,或者讓我知道,如果我用關係咆哮錯誤的樹這個問題。

謝謝!

回答

3

這是一個很好的情況,你會使用核心數據關係。

通常的Apple文檔(https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html)會讓你很好地理解它是如何工作的。

總之,對於一種關係,您可以指定一個刪除規則。 就你而言,你可能會選擇「Nullify」。這意味着,如果您刪除表格,則您的Person的表格屬性將變爲null,表示您的人員不再坐在桌子上。

編輯:你也可以指定「Cascade」,它會將表格與表格一起刪除(而不是毫無意義,但略微有趣的想法)。或者,您可以指定「拒絕」,如果至少有一個人仍然坐在桌子上,則會中止刪除。

例子:

假設你有兩個實體, 「TableInfo」 和 「PersonInfo」。 「PersonInfo」具有的關係稱爲「表」,「TableInfo」具有關係稱爲「個人」。 「table」與作爲其目標的「TableInfo」是一對一的關係。 「人物」與「PersonInfo」作爲目標是一對多的關係。

現在將「人員」的「反向關係」設置爲「表格」。 「表格」的「反向關係」將自動設置爲「人員」。

如果你讓CoreData生成模型的子類(!你應該),你最終會像這樣一類:

@interface TableInfo : NSManagedObject 

@property (nonatomic, retain) NSSet *persons; 
@end 

@interface TableInfo (CoreDataGeneratedAccessors) 

- (void)addPersonsObject:(PersonInfo *)value; 
- (void)removePersonsObject:(PersonInfo *)value; 
- (void)addPersons:(NSSet *)values; 
- (void)removePersons:(NSSet *)values; 

正如你所看到的,CoreData自動爲您創建appropiate存取。只要使用它們。

您現在可以執行以下操作:

TableInfo* myTable = [NSEntityDescription insertNewObjectForEntityForName:@"TableInfo" inManagedObjectContext:self.managedObjectContext]; 

PersonInfo* myPerson = [NSEntityDescription insertNewObjectForEntityForName:@"PersonInfo" inManagedObjectContext:self.managedObjectContext]; 

[myTable addPersonsObject:myPerson]; 
NSLog(@"%@", myPerson.table); // will be your TableInfo object "myTable" 

總之,請閱讀我上面鏈接的文檔,有大量的實例,並在互聯網上。隨意就SO提出問題,但對於「基本」需求,互聯網上的教程將更加完整和有用。

+0

啊,非常有用。但是,如何將一個人添加到表格中?由於人不是表的屬性,並且實體不能是實體的屬性。 – 2012-03-25 20:49:57

+1

只需定義關係,讓CoreData爲您創建類。您可以訪問與屬性相同的關係,即您將提供[TableInfo addPersonInfo:]和[PersonInfo setTableInfo:]等。 – JiaYow 2012-03-25 20:54:49

+0

感謝您的幫助,抱歉,您必須忍受我的困擾。事情變得清晰了。我的應用程序中的核心數據使用情況取決於Apples自己的CoreData Books示例代碼。因此,例如,用戶可以使用UINavigationViewController跳過,選擇一個訪客,然後編輯該訪客的屬性,例如其名稱和表格。有了這種關係,我是否像正常一樣對待table屬性?但改爲使用關係名稱作爲關鍵?等 – 2012-03-25 23:14:05