2009-12-02 51 views
7

我初始化使用NSManagedObject子類:NSManagedObject子類和setValuesForKeysWithDictionary:

- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues 

我還故意給它未定義的鍵,這當然應該拋出異常。

所以,我已經實現:

- (void)setValue:(id)value forUndefinedKey:(NSString *)key 

如果關鍵是不確定的,我把它映射到正確的鍵。

但是,我的實現永遠不會被調用,而是使用NSManagedObject的實現,這又會導致仍然引發異常。

是否有阻止setValuesForKeysWithDictionary:使用setValue:forUndefinedKey:的任何NSManagedObject子類實現的行爲(或錯誤)?

添加代碼的要求,但因爲我只是執行現有的方法,該方法不會被調用,我不知道會有多大的幫助是:

在上下文:

- (Company*)companyWithDictionary:(NSDictionary*)values{ 

    Company* newCompany = (Company*)[NSEntityDescription insertNewObjectForEntityForName:@"Company" inManagedObjectContext:self]; 

    [newCompany setValuesForKeysWithDictionary:values]; 

    return newCompany; 
} 

Company子類(從來沒有所謂的):

- (void)setValue:(id)value forUndefinedKey:(NSString *)key{ 

    if([key isEqualToString:idKey]){ 

     [self setValue:value forKey:@"uniqueID"]; 

    }else if([key isEqualToString:descriptionKey]){ 

     [self setValue:value forKey:@"descriptionText"]; 

    }else if([key isEqualToString:timeUpdatedKey]){ 

     [self setValue:value forKey:@"dateUpdated"]; 

    }else{ 

     [super setValue:value forUndefinedKey:key]; 

    } 
} 

回答

3

肯定有什麼內在NSManagedObject防止這一點;我在我正在開發的應用程序中正是這樣做的。你能發佈更多的代碼嗎?

還有一個想法,你確定它是setValue:forUndefinedKey:這是拋出異常?對於一個託管對象,我敢肯定你還需要實現valueForUndefinedKey:(getter)來使事情正常工作。

+0

是的,我看到它在堆棧跟蹤。這也是NSManagedObject的實現。 – 2009-12-02 17:09:41

+0

我還沒有實現valueForUndefinedKey :.我會嘗試,但是我不明白爲什麼會通過失敗者。 – 2009-12-02 17:10:27

+0

增加了一些代碼... – 2009-12-02 17:18:17

2

簡單的問題,但你指定你的模型中的實體的NSManagedObject子類的類名?

另外,你說你正在初始化託管對象......怎麼樣?在大多數情況下,你應該通過+ [NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]插入它,除非你有充分的理由不這樣做。

+0

是和是。我也重新創建了我的模型類。我也嘗試在模型類AND中實現valueFOrUndefinedKey作爲一個類。 – 2009-12-02 17:12:03

+0

這確實很奇怪。你可以在減少的測試用例中重現這一點嗎?我做了類似的事情,但從未遇到過這個問題。 – 2009-12-02 18:50:43

1

CoreData框架的快速類轉儲表明NSManagedObject也覆蓋setValuesForKeysWithDictionary:,所以它看起來確實在爲該方法做一些定製,可能是出於性能原因或類似的原因。我可能會寫我自己的方法相當於setValuesForKeysWithDictionary:,並調用它來避免整個混亂。像這樣:

- (void)mySetValuesForKeysWithDictionary:(NSDictionary*)dict 
{ 
    for (NSString* key in dict) 
     [self setValue:[dict objectForKey:key] forKey:key]; 
} 
+0

這基本上是我所做的,但佔NSNull值。即使在實施Sixten的解決方案之後,還有一些其他奇怪的錯誤,所以我拋出了毛巾。 – 2009-12-02 21:07:36