0

NSManagedObjectクラスがいくつかあります。NSDictionaryオブジェクトに解析するサーバーからJSONデータを取得しています。JSONからNSDictionaryへの変換が発生すると、すべてのデータがNSStringとしてキャストされます。次に、このディクショナリを管理対象オブジェクトにマップすると、次のようになります。

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

したがって、私の管理対象オブジェクトは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 に答える