NSManagedObject子类和setValuesForKeysWithDictionary:

时间:2009-12-02 16:33:10

标签: cocoa cocoa-touch core-data key-value-coding

我正在使用:

初始化NSManagedObject子类
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues

我也故意给它未定义的密钥,当然应该抛出异常。

所以,我已经实施了:

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

如果未定义某个键,我会将其映射到正确的键。

但是,我的实现永远不会被调用,而是使用NSManagedObject的实现,而仍然会抛出异常。

是否存在阻止setValuesForKeysWithDictionary:使用NSManagedObject的任何setValue:forUndefinedKey:子类实现的行为(或错误)?

按要求添加代码,但由于我只是实现了一个现有的方法,但没有被调用,我不知道它会有多大的帮助:

在上下文中:

- (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 个答案:

答案 0 :(得分:3)

NSManagedObject肯定没有什么可以阻止这种情况;我在我正在开发的应用程序中正是这样做的。你能发布更多的代码吗?

还有一个想法:你确定它是setValue:forUndefinedKey:抛出异常吗?对于托管对象,我非常确定您还需要实现valueForUndefinedKey:(getter)才能使事情正常工作。

答案 1 :(得分:2)

简单的问题,但是您是否为模型中的实体指定了NSManagedObject子类的类名?

另外,你说你正在初始化托管对象......怎么样?在大多数情况下,你应该通过+ [NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]插入它,除非你有充分的理由不这样做。

答案 2 :(得分:1)

CoreData框架的快速类转储表明NSManagedObject也会覆盖setValuesForKeysWithDictionary:,所以它看起来肯定是在为该方法做一些自定义,可能是出于性能原因或类似的原因。我可能只是编写自己的方法等效于setValuesForKeysWithDictionary:并调用它来避免整个混乱。像这样:

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