CoreData でサポートされているエンティティの 1 対多の関係に問題があります。
私のJSONは次のようになります。
[
{
"uuid": "0",
"title": "humor",
"providers": [{
"provider": {
"uuid": "1",
"title": "dilbert",
"sections": [{
"section": { "uuid":"1990", "title": "daily"},
"section": { "uuid":"1991", "title": "weekly"},
}],
},
"provider": {
"uuid": "2",
"title": "wizard of id",
},
"provider": {
"uuid": "3",
"title": "bc",
},
},],
},
{
"uuid": "22",
"title": "photo",
},
]
私の場合、最上位オブジェクトはカテゴリであり、0..* セクションを持つことができる 0..* プロバイダーを持つことができます。
更新:これをまとめると、この問題の根本は、JSON の形式が正しくないことです。辞書の末尾にカンマがあってはなりません。
私のRestKitマッピングは次のとおりです。
RKEntityMapping *sectionMapping = [RKEntityMapping mappingForEntityForName:@"DHSection" inManagedObjectStore:managedObjectStore];
[sectionMapping addAttributeMappingsFromDictionary:@{
@"section.uuid" : @"uuid",
@"section.title" : @"title",
}];
sectionMapping.identificationAttributes = @[@"uuid"];
RKEntityMapping *providerMapping = [RKEntityMapping mappingForEntityForName:@"DHProvider" inManagedObjectStore:managedObjectStore];
[providerMapping addAttributeMappingsFromDictionary:@{
@"provider.uuid" : @"uuid",
@"provider.title" : @"title",
}];
providerMapping.identificationAttributes = @[@"uuid"];
RKRelationshipMapping *sectionRelationship = [RKRelationshipMapping relationshipMappingFromKeyPath:@"provider.sections" toKeyPath:@"sections" withMapping:sectionMapping];
[sectionRelationship setAssignmentPolicy:RKUnionAssignmentPolicy];
[providerMapping addPropertyMapping:sectionRelationship];
RKEntityMapping *categoryMapping = [RKEntityMapping mappingForEntityForName:@"DHCategory" inManagedObjectStore:managedObjectStore];
[categoryMapping addAttributeMappingsFromDictionary:@{
@"uuid" : @"uuid",
@"title" : @"title",
}];
categoryMapping.identificationAttributes = @[@"uuid"];
RKRelationshipMapping *providerRelationship = [RKRelationshipMapping relationshipMappingFromKeyPath:@"providers" toKeyPath:@"providers" withMapping:providerMapping];
[providerRelationship setAssignmentPolicy:RKUnionAssignmentPolicy];
[categoryMapping addPropertyMapping:providerRelationship];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:categoryMapping method:RKRequestMethodGET pathPattern:@"category/list.json" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:responseDescriptor];
[objectManager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) {
RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:@"category/list.json"];
NSDictionary *argsDict = nil;
BOOL match = [pathMatcher matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:&argsDict];
if (match) {
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"DHCategory"];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"uuid" ascending:YES]];
return fetchRequest;
}
return nil;
}];
RestKit が応答を解析すると、2 つのカテゴリが正しく解析されますが、最初のプロバイダーとセクションのみが読み込まれます。
2013 年 11 月 1 日更新: 上記の更新されたマッピングにより、セクションの関係マッピングが修正され、キー パス「provider.sections」と「sections」からマッピングされました。
この問題は、応答とマッピングされているものの違いに起因する可能性があります。
2013-11-01 10:40:06.670 xyz[58006:1003] D restkit.object_mapping:RKMapperOperation.m:377 Executing mapping operation for representation: (
{
providers = (
{
provider = {
sections = (
{
section = {
title = daily;
uuid = 1990;
};
}
);
title = dilbert;
uuid = 1;
};
}
);
title = humor;
uuid = 0;
},
...
応答があった間
response.body=[
{
"uuid": "0",
"title": "humor",
"providers": [
{
"provider": {
"uuid": "1",
"title": "dilbert",
"sections": [{
"section": { "uuid":"1990", "title": "daily"},
"section": { "uuid":"1991", "title": "weekly"},
}
],
},
"provider": {
"uuid": "3",
"title": "wizard of id",
},
"provider": {
"uuid": "2",
"title": "bc",
},
},
],
},
...
これを修正またはデバッグする方法についてのアイデアはありますか?
ありがとう、
マイク