7

我正在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];

    } 
}
4

3 回答 3

3

NSManagedObject 绝对没有任何内在的东西可以阻止这种情况。我在我正在开发的应用程序中正是这样做的。您可以发布更多代码吗?

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

于 2009-12-02T16:45:50.697 回答
2

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

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

于 2009-12-02T16:47:17.537 回答
1

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

- (void)mySetValuesForKeysWithDictionary:(NSDictionary*)dict
{
    for (NSString* key in dict)
        [self setValue:[dict objectForKey:key] forKey:key];
}
于 2009-12-02T18:39:47.833 回答