2011-12-28 93 views
1

我試圖找到關於如何讓用戶動態地添加對象並應用必要的關係的蘋果文檔/教程,但需要一些幫助,教程是好的或蘋果文檔將提供什麼幫助。如何將核心數據中的實體保存並應用關係?

我的核心數據問題的一個例子:的PhotographerPhoto 2級的實體,其中存在PhotographerPhoto之間的1對多的關係。當用戶添加一個Photo時,我需要能夠指定哪個Photographer佔用了那個Photo

回答

4

所以,首先你的照片創建一個新的實體:

NSManagedObject *photoObject = [NSEntityDescription 
      insertNewObjectForEntityForName:[entity name] 
        inManagedObjectContext:context];  

的NSManagedObject可以與你的照片對象或W/E來代替,如果你有一個子類製成。 您將設置它的所有屬性。要設置攝影師,您將像設置任何其他屬性一樣設置攝影師。如果您沒有攝影師的參考,您可以像這樣查詢:

NSFetchRequest *query = [[NSFetchRequest alloc] initWithEntityName:@"Photographer"]; 
    [query setPredicate:[NSPredicate predicateWithFormat:@"id == %@", photographerId]]; 
    NSArray *queryResults = [context executeFetchRequest:bcQuery error:&error]; 

您的查詢結果將有攝影師對象。然後,您可以將其設置在photoObject上作爲任何其他屬性,並且鏈接將自動創建。

 [photoObject setPhotographer:[queryResults objectAtIndex:0]]; 

,或者如果你正在使用NSManagedObject:

[photoObject setValue:[queryResults objectAtIndex:0] forKey:@"photographer"]; 

與CoreData很酷的事情是,它是關係。你不能真的把它看作典型的DBMS。您可以創建對象並以面向對象的方式設置它們之間的關係。沒有主鍵/外鍵需要照顧,這些都是由CoreData在後臺完成的。

編輯:

您可以選擇創建NSManagedObject的子類,以更輕鬆地訪問屬性和關係對你的實體。確保在CoreData模型瀏覽器中指定此子類;在側邊欄中,您會將「類」字段更改爲新的子類。

這裏是一個NSManagedObject子類的實例:

//Interface 
@interface Photo : NSManagedObject 

#pragma mark - Attributes 

@property (nonatomic, strong) NSNumber *id; 
@property (nonatomic, strong) NSString *name; 

#pragma mark - Relationships 

@property (nonatomic, strong) NSSet  *someToManyRelationship; 
@property (nonatomic, strong) Photographer *photographer; 

@end 

//Implementation 
@implementation Photo 

@dynamic id, name; 
@dynamic someToManyRelationship, photographer; 

@end 

希望這有助於!

+0

在第二行到最後一行代碼中,'setPhotographer'從哪裏來?這是關係的名字嗎?在你的最後一行代碼中 - forKey:@「Photographer」'設置'photoObject'的屬性? – tarheel 2011-12-28 09:49:28

+0

你可以創建你自己的NSManagedObject的子類。我會添加一個例子。在這個子類中,您可以指定所有屬性和關係的屬性,並使用setter和getters更容易地訪問它們。如果你不創建一個子類,你仍然可以通過一個NSManagedObject類來完成所有的事情。但是,要爲您的屬性和關係設置值,您必須使用setValue:forKey:方法。 – MGA 2011-12-29 03:01:48