0

我有几个 NSManagedObject 类。我正在从解析为 NSDictionary 对象的服务器中提取一些 JSON 数据。当发生从 JSON 到 NSDictionary 的转换时,我的所有数据都被转换为 NSStrings。然后,当我将此字典映射到我的 managedObject 时,我得到以下信息:

Unacceptable type of value for attribute: property = "idexpert"; desired type = NSNumber; given type = __NSCFString; value = 1.'

所以我的 managedobject 正在寻找一个 NSNumber 但它得到一个字符串并抛出异常

有没有一种方法可以在我调用setValuesForKeysWithDictionary时自动为它们要进入的托管对象正确转换值?

谢谢!

4

2 回答 2

1

在保存核心数据的同时管理 JSON 属性的最佳方法是编写一个可以覆盖 setValuesForKeysWithDictionary 的通用函数,如下所示:

@implementation NSManagedObject (safeSetValuesKeysWithDictionary)

- (void)safeSetValuesForKeysWithDictionary:(NSDictionary *)keyedValues dateFormatter:(NSDateFormatter *)dateFormatter
{
    NSDictionary *attributes = [[self entity] attributesByName];
    for (NSString *attribute in attributes) {
        id value = [keyedValues objectForKey:attribute];
        if (value == nil) {
            continue;
        }
        NSAttributeType attributeType = [[attributes objectForKey:attribute] attributeType];
        if ((attributeType == NSStringAttributeType) && ([value isKindOfClass:[NSNumber class]])) {
            value = [value stringValue];
        } else if (((attributeType == NSInteger16AttributeType) || (attributeType == NSInteger32AttributeType) || (attributeType == NSInteger64AttributeType) || (attributeType == NSBooleanAttributeType)) && ([value isKindOfClass:[NSString class]])) {
            value = [NSNumber numberWithInteger:[value integerValue]];
        } else if ((attributeType == NSFloatAttributeType) &&  ([value isKindOfClass:[NSString class]])) {
            value = [NSNumber numberWithDouble:[value doubleValue]];
        } else if ((attributeType == NSDateAttributeType) && ([value isKindOfClass:[NSString class]]) && (dateFormatter != nil)) {
            value = [dateFormatter dateFromString:value];
        }
        [self setValue:value forKey:attribute];
    }
}
@end

有关更多详细信息,请参阅此链接:http ://www.cimgf.com/2011/06/02/saving-json-to-core-data/

于 2015-06-03T19:31:33.677 回答
0

如果您收到的 json 实际上具有数字值并且它们被转换为字符串,您应该获得一个新的 json 解析器。我推荐 NXJson。否则不会发生任何神奇的铸造。

如果 json 返回诸如 {"idexpert":"1"} 之类的字符串,那么您可以覆盖 setValuesForKeysWithDictionary 并执行类似以下代码的操作;


-(void)setValuesForKeysWithDictionary:(NSDictionary *)d{
   NSMutableDictionary *newDict = [NSMutableDictionary dictionaryWithDictionary:d];
   NSString *value = [newDict valueForKey:@"idexpert"];
   [newDict setValue:[NSNumber numberWithLong:[value longValue]] forKey:@"idexpert"];
   [super setValuesForKeysWithDictionary:newDict];
}
于 2012-05-04T20:03:25.003 回答