Ios Restkit动态属性映射

Ios Restkit动态属性映射,ios,restkit,restkit-0.20,Ios,Restkit,Restkit 0.20,我正在使用RestKitV0.21,并试图用动态名称映射一个值数组。我能够正确获取自定义字段的名称,但无法捕获关联的值。JSON如下所示: { "id": 1, "firstName": "Kenny", "lastName": "Powers", "customFields": { "favorite color": "blue", "hometown": "Cleveland", "spouse name": "

我正在使用RestKitV0.21,并试图用动态名称映射一个值数组。我能够正确获取自定义字段的名称,但无法捕获关联的值。JSON如下所示:

{
    "id": 1,
    "firstName": "Kenny",
    "lastName": "Powers",
    "customFields": {
        "favorite color": "blue",
        "hometown": "Cleveland",
        "spouse name": "sally"
    }
}
//PERSON MAPPING
RKEntityMapping *personMapping = [RKEntityMapping mappingForEntityForName:@"Person" inManagedObjectStore:[RKManagedObjectStore defaultStore]];
[personMapping addAttributeMappingsFromDictionary:@{
                                                     @"id":             @"personId",
                                                     @"firstName":      @"firstName",
                                                     @"lastName":       @"lastName"}];
personMapping.identificationAttributes = @[ @"personId" ];

//CUSTOM FIELD MAPPING
RKEntityMapping *customFieldMapping = [RKEntityMapping mappingForEntityForName:@"CustomValue" inManagedObjectStore:[RKManagedObjectStore defaultStore]];
customFieldMapping.forceCollectionMapping = YES;
[customFieldMapping addAttributeMappingFromKeyOfRepresentationToAttribute:@"fieldName"];
[customFieldMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"(fieldName)" toKeyPath:@"fieldValue"]];

[personMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"customFields"
                                                                             toKeyPath:@"customValues"
                                                                           withMapping:customFieldMapping]];
@interface CustomValue : NSManagedObject

@property (nonatomic, retain) NSString * fieldValue;

@end
我的映射如下所示:

{
    "id": 1,
    "firstName": "Kenny",
    "lastName": "Powers",
    "customFields": {
        "favorite color": "blue",
        "hometown": "Cleveland",
        "spouse name": "sally"
    }
}
//PERSON MAPPING
RKEntityMapping *personMapping = [RKEntityMapping mappingForEntityForName:@"Person" inManagedObjectStore:[RKManagedObjectStore defaultStore]];
[personMapping addAttributeMappingsFromDictionary:@{
                                                     @"id":             @"personId",
                                                     @"firstName":      @"firstName",
                                                     @"lastName":       @"lastName"}];
personMapping.identificationAttributes = @[ @"personId" ];

//CUSTOM FIELD MAPPING
RKEntityMapping *customFieldMapping = [RKEntityMapping mappingForEntityForName:@"CustomValue" inManagedObjectStore:[RKManagedObjectStore defaultStore]];
customFieldMapping.forceCollectionMapping = YES;
[customFieldMapping addAttributeMappingFromKeyOfRepresentationToAttribute:@"fieldName"];
[customFieldMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"(fieldName)" toKeyPath:@"fieldValue"]];

[personMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"customFields"
                                                                             toKeyPath:@"customValues"
                                                                           withMapping:customFieldMapping]];
@interface CustomValue : NSManagedObject

@property (nonatomic, retain) NSString * fieldValue;

@end
我看到的所有动态属性示例都涉及一个值对象,其中的值映射类似于“(fileName).email”。在我的例子中,它总是一个字符串:名称和值的字符串集,表示一组完全动态的自定义字段和伴随值

检查自定义字段对象集合时,设置了fieldName属性,但fieldValue属性为all(null)

有什么想法吗

更新:以下是自定义字段数组中元素的一个映射的日志输出:

2013-10-11 09:54:45.558 MyMobile[45460:6207] D restkit.object_mapping:RKMappingOperation.m:851 Starting mapping operation...
2013-10-11 09:54:45.558 MyMobile[45460:6207] T restkit.object_mapping:RKMappingOperation.m:852 Performing mapping operation: <RKMappingOperation 0x17a71230> for 'CustomValue' object. Mapping values from object {
    "Youtube Link" = "http://www.youtube.com";
} to object <CustomValue: 0xac42b00> (entity: CustomValue; id: 0xac69420 <x-coredata://D54F8070-D653-49E2-AFD5-90CD9778B2D4/CustomValue/p3> ; data: {
    fieldName = "Youtube Link";
    fieldValue = nil;
    person = "0x16f8d200 <x-coredata://D54F8070-D653-49E2-AFD5-90CD9778B2D4/Person/p389>";
}) with object mapping (null)
2013-10-11 09:54:45.559 MyMobile[45460:6207] D restkit.object_mapping:RKMappingOperation.m:813 Found nested mapping definition to attribute 'fieldName'
2013-10-11 09:54:45.560 MyMobile[45460:6207] D restkit.object_mapping:RKMappingOperation.m:816 Found nesting value of 'Youtube Link' for attribute 'fieldName'
2013-10-11 09:54:45.562 MyMobile[45460:6207] T restkit.object_mapping:RKMappingOperation.m:440 Mapping attribute value keyPath '<RK_NESTING_ATTRIBUTE>' to 'fieldName'
2013-10-11 09:54:45.562 MyMobile[45460:6207] T restkit.object_mapping:RKMappingOperation.m:429 Found transformable value at keyPath '<RK_NESTING_ATTRIBUTE>'. Transforming from class '__NSCFString' to 'NSString'
2013-10-11 09:54:45.563 MyMobile[45460:6207] T restkit.object_mapping:RKMappingOperation.m:475 Skipped mapping of attribute value from keyPath '<RK_NESTING_ATTRIBUTE> to keyPath 'fieldName' -- value is unchanged (Youtube Link)
2013-10-11 09:54:45.564 MyMobile[45460:6207] T restkit.object_mapping:RKMappingOperation.m:497 Skipping attribute mapping for special keyPath '<RK_NESTING_ATTRIBUTE>'
2013-10-11 09:54:45.564 MyMobile[45460:6207] T restkit.object_mapping:RKMappingOperation.m:440 Mapping attribute value keyPath 'Youtube Link' to 'fieldValue'
2013-10-11 09:54:45.565 MyMobile[45460:6207] T restkit.object_mapping:RKMappingOperation.m:429 Found transformable value at keyPath 'Youtube Link'. Transforming from class '__NSCFString' to 'NSString'
2013-10-11 09:54:45.565 MyMobile[45460:6207] E restkit.object_mapping:RKMappingOperation.m:431 Failed transformation of value at keyPath 'Youtube Link' to representation of type 'NSString': (null)
2013-10-11 09:54:45.566 MyMobile[45460:6207] D restkit.object_mapping:RKMappingOperation.m:920 Finished mapping operation successfully...
2013-10-11 09:54:45.558 MyMobile[45460:6207]D restkit对象映射:RKMappingOperation.m:851正在启动映射操作。。。
2013-10-11 09:54:45.558 MyMobile[45460:6207]T restkit.对象映射:RKMappingOperation.m:852执行映射操作:针对“CustomValue”对象。从对象映射值{
“Youtube链接”=”http://www.youtube.com";
}对象(实体:CustomValue;id:0xac69420;数据:{
fieldName=“Youtube链接”;
fieldValue=零;
person=“0x16f8d200”;
})具有对象映射(空)
2013-10-11 09:54:45.559 MyMobile[45460:6207]D restkit对象映射:RKMappingOperation.m:813找到属性“fieldName”的嵌套映射定义
2013-10-11 09:54:45.560 MyMobile[45460:6207]D restkit.对象映射:RKMappingOperation.m:816找到属性“fieldName”的“Youtube链接”的嵌套值
2013-10-11 09:54:45.562 MyMobile[45460:6207]T restkit对象映射:RKMappingOperation.m:440将属性值keyPath“”映射到“fieldName”
2013-10-11 09:54:45.562 MyMobile[45460:6207]T restkit对象映射:RKMappingOperation.m:429在键路径“”处找到可转换值。从类“\uu NSCFString”转换为“NSString”
2013-10-11 09:54:45.563 MyMobile[45460:6207]T restkit.对象映射:RKMappingOperation.m:475跳过了属性值从keyPath'到keyPath'fieldName'的映射--值不变(Youtube链接)
2013-10-11 09:54:45.564 MyMobile[45460:6207]T restkit对象映射:RKMappingOperation.m:497跳过特殊键路径“”的属性映射
2013-10-11 09:54:45.564 MyMobile[45460:6207]T restkit.对象映射:RKMappingOperation.m:440将属性值keyPath“Youtube链接”映射到“字段值”
2013-10-11 09:54:45.565 MyMobile[45460:6207]T restkit.对象映射:RKMappingOperation.m:429在键路径“Youtube链接”处找到可转换值。从类“\uu NSCFString”转换为“NSString”
2013-10-11 09:54:45.565 MyMobile[45460:6207]E restkit.对象映射:RKMappingOperation.m:431无法将键路径“Youtube链接”处的值转换为类型“NSString”的表示形式:(null)
2013-10-11 09:54:45.566 MyMobile[45460:6207]D restkit对象映射:RKMappingOperation.m:920已成功完成映射操作。。。

我最近遇到了类似的问题。在使用动态属性映射时,有时似乎没有正确初始化值转换器

我在我的
NSManagedObject
子类中将属性从
NSString
更改为type
id
,找到了一个解决方法。例如,假设您的NSManagedObject通常如下所示:

{
    "id": 1,
    "firstName": "Kenny",
    "lastName": "Powers",
    "customFields": {
        "favorite color": "blue",
        "hometown": "Cleveland",
        "spouse name": "sally"
    }
}
//PERSON MAPPING
RKEntityMapping *personMapping = [RKEntityMapping mappingForEntityForName:@"Person" inManagedObjectStore:[RKManagedObjectStore defaultStore]];
[personMapping addAttributeMappingsFromDictionary:@{
                                                     @"id":             @"personId",
                                                     @"firstName":      @"firstName",
                                                     @"lastName":       @"lastName"}];
personMapping.identificationAttributes = @[ @"personId" ];

//CUSTOM FIELD MAPPING
RKEntityMapping *customFieldMapping = [RKEntityMapping mappingForEntityForName:@"CustomValue" inManagedObjectStore:[RKManagedObjectStore defaultStore]];
customFieldMapping.forceCollectionMapping = YES;
[customFieldMapping addAttributeMappingFromKeyOfRepresentationToAttribute:@"fieldName"];
[customFieldMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"(fieldName)" toKeyPath:@"fieldValue"]];

[personMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"customFields"
                                                                             toKeyPath:@"customValues"
                                                                           withMapping:customFieldMapping]];
@interface CustomValue : NSManagedObject

@property (nonatomic, retain) NSString * fieldValue;

@end
尝试将此更改为:

@interface CustomValue : NSManagedObject

@property (nonatomic, retain) id fieldValue;

@end
您还必须将数据模型中的
字段值
字符串
更改为
可转换


在我这样做之后,映射仍然将类型转换为
NSString
,但它成功了。

不知道它是否能工作,但您可以尝试
attributeMappingFromKeyPath:nil toKeyPath:@“fieldValue”
。需要逐步完成映射过程以查看可用的数据…我尝试了以下操作:
[customFieldMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil TokePath:@“fieldValue”]但没有太大区别。当单步执行时,映射过程的源代码中的位置将是一个很好的查看位置?打开映射的跟踪日志记录,并通过
RKMappingOperation.m查看调试。我用日志详细信息更新了我的原始问题。有什么东西向你扑来吗?没有。我不确定您是否可以直接使用映射来实现。restkitapi基于将字典中的每个未知键提取到单个对象中。我认为是强制收集映射把所有东西都弄混了。