2011-11-12 62 views
0

我創建了一個包含兩個實體的模型。實體A與實體B有關係(一對一)。我的問題是,我不知道如何爲關係設置默認值。如果我向實體添加一個新條目,那麼對於關係的值(發送到相應的NSArrayControler或[newObjectEntityA initWithEntity:....]的值將得到「無值」。我缺少的是分配像的屬性關係的默認值核心數據關係的默認值

例:

Entity A 
attrib a (has a default value) 
attrib b (has a default value) 
relation to B (has no default value) 

當然的解決辦法是這樣的:

[newObjectEntityA setValue: defaultValueInEntityB forKey:@"relationToB"]; 

,但我認爲必須有一個更方便的解決方案

在此先感謝, 托馬斯

回答

0

好吧......我得到了問題解決(或多或少)。我所做的是繼承NSManagedObject和我重寫的方法 - (無效)initWithEntity:insertIntoManagedObjectContext:

@implementation Locos 
static NSManagedObject *defaultType; 

- (id)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(NSManagedObjectContext *)context 
{ 
    self=[super initWithEntity:entity insertIntoManagedObjectContext:context]; 

    if(self==nil) 
    { 
     [self release]; 
     return(nil); 
    } 

    if(defaultType==nil) 
    { 
     NSEntityDescription* locoType=[NSEntityDescription entityForName:@"LocoType" inManagedObjectContext:context]; 
     if(locoType==nil) return(self); 

     NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
     [request setEntity:locoType]; 
     NSPredicate *predicate=[NSPredicate predicateWithFormat:@"Default==TRUE"]; 
     [request setPredicate:predicate]; 
     [context executeFetchRequest:request error:nil]; 

     NSArray *array=[context executeFetchRequest:request error:nil]; 

     defaultType=[array objectAtIndex:0]; 
    } 

    if(defaultType!=nil) 
    { 
     [self setPrimitiveValue: defaultType forKey:@"Type"]; 
    } 

    return(self); 
} 
@end 

它設置在實體的關係「類型」「的Locos」在實體的第一條記錄「LocoType 「其屬性」Default「設置爲true。它有效,但有一些我不明白。我得到一個非常奇怪的效果,如果我簡化的方法進行:

@implementation Locos 

- (id)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(NSManagedObjectContext *)context 
{ 
    self=[super initWithEntity:entity insertIntoManagedObjectContext:context]; 

    if(self==nil) 
    { 
     [self release]; 
     return(nil); 
    } 

    NSEntityDescription* locoType=[NSEntityDescription entityForName:@"LocoType" inManagedObjectContext:context]; 
    if(locoType==nil) return(self); 

    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
    [request setEntity:locoType]; 
    NSPredicate *predicate=[NSPredicate predicateWithFormat:@"Default==TRUE"]; 
    [request setPredicate:predicate]; 
    [context executeFetchRequest:request error:nil]; 

    NSArray *array=[context executeFetchRequest:request error:nil]; 

    [self setPrimitiveValue: [array objectAtIndex:0] forKey:@"Type"]; 

    return(self); 
} 
@end 

在這種情況下,如果我推這勢必增加一個按鈕:一個陣列控制器(其結合至實體「的Locos」)的我總是得到兩個新的條目!我運行調試器,initWithEntry方法只被調用一次。我刪除行

[context executeFetchRequest:request error:nil]; 

它還如果取只調用一次因爲在我保存記錄我的靜態變量第一個代碼示例不會發生我也得到儘快消除這個問題。

有沒有人知道會發生什麼?

+0

Awakefrominsert將是一個更好的方法來覆蓋,我認爲。 – jrturton

+0

你好jrturton!這是一種更好的解決方案!謝謝! –

+0

好吧,我會把它作爲一個非常簡短的答案! – jrturton

1

我會創建一個工廠,創建A的新對象並根據您的需要進行預配置。

3

您應該重寫awakeFromInsert而不是,此方法用於添加默認值和其他啓動操作。