代码之家  ›  专栏  ›  技术社区  ›  Corey Floyd

NSManagedObject子类和setValuesForKeysWithDictionary:

  •  7
  • Corey Floyd  · 技术社区  · 16 年前

    NSManagedObject 子类使用:

    - (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues
    

    我还故意给它未定义的键,当然 应该

    因此,我实施了:

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

    然而,我的实现从未被调用 被管理对象 仍然 抛出异常。

    setValuesForKeysWithDictionary: 被管理对象 的子类实现 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 回复  |  直到 13 年前
        1
  •  3
  •   Sixten Otto    16 年前

    NSManagedObject没有任何内在的东西可以阻止这一点;我正是在我正在开发的应用程序中这样做的。你能发布更多的代码吗?

    setValue:forUndefinedKey: 这就是抛出异常?对于托管对象,我非常确定您还需要实现 valueForUndefinedKey: 使事物正常运转。

        2
  •  2
  •   Joshua Nozzi    16 年前

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

        3
  •  1
  •   Brian Webster    16 年前

    CoreData框架的快速类转储表明 NSManagedObject 也覆盖 setValuesForKeysWithDictionary: 设置RKEYSWITHDIctionary的值: 并称之为避免整个混乱。大概是这样的:

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