0

我正在尝试使用共享管理器在一个 GET 请求期间使用 RestKit 更新多个模型,例如:

[[RKObjectManager sharedManager] addResponseDescriptor:responseDescriptor];

whereresponseDescriptor有一个映射、关键路径和路径模式。

获取的 JSON 包含五个独立的模型,当从一个空应用程序开始时,它的大小可能很大,比如总共 300 个对象(不同类型)。这是一个显示一般结构的编辑示例。事情看起来像那样,但应用程序中还有更多。

{
"rooms":[{"id":1,"name":"Hall A"},{"id":2,"name":"Hall B"}],
"sessions":[{"id":168,"title":"Pre-emptive value-added strategy","room_id":1}]
}

在我尝试使用的一个映射RKConnectonDescription中,CoreData 知道它们是基于外键相关的。例如:

    NSRelationshipDescription *roomRelationship = [_sessionMapping.entity relationshipsByName][@"room"];
    [_sessionMapping addConnection:[[RKConnectionDescription alloc] initWithRelationship:roomRelationship attributes:@{ @"roomRemoteId": @"remoteId" }]];

所有 CoreData 对象都使用 remoteId 属性作为通过 json 提供的 id 的标识属性。例如,会话映射如下所示:

    _sessionMapping = [RKEntityMapping mappingForEntityForName:@"Session" inManagedObjectStore:[RKObjectManager sharedManager].managedObjectStore];
    _sessionMapping.identificationAttributes = @[ @"remoteId" ];
    [_sessionMapping addAttributeMappingsFromDictionary:@{
     @"id" : @"remoteId",
     @"title": @"title",
     @"room_id": @"roomRemoteId"}];

房间映射如下所示:

    _roomMapping = [RKEntityMapping mappingForEntityForName:@"Room" inManagedObjectStore:[RKObjectManager sharedManager].managedObjectStore];
    _roomMapping.identificationAttributes = @[ @"remoteId" ];
    [_roomMapping addAttributeMappingsFromDictionary:@{
     @"id" : @"remoteId",
     @"name": @"name"
     }];

我发现,当我从一个空数据库开始并获取所有对象时,只有一些会话有房间。Session 模型确实有一个roomRemoteId字段,房间确实有一个remoteId. 我抽查了其中一个没有房间的会话,它确实有一组,我可以在数据库中roomRemoteId查找一个带有该房间的房间。remoteId

我估计大约 25% 的会话看起来不错,但其他 75% 有roomRemoteId但没有设置房间关系。

所以问题是,为什么有些会话映射正确而其他会话不正确?

4

1 回答 1

0

感谢 Wain 的好建议!在将全局 Restkit 日志级别提升到 trace 之后,我注意到我在 Room for 上有一个反比关系sessions——但我已经将它隔开,而不是一对多。有很多看起来像这样的日志条目:

D restkit.core_data:RKRelationshipConnectionOperation.m:198 Connected relationship 'room' to object '<Room: 0x96fad00> (entity: Room; id: 0x1082e150 <x-coredata:///Room/t3B6287B3-4478-4B64-9D83-9C85387C377D629> ; data: {
    name = 2204;
    remoteId = 24;
    sessions = "0x1081b320 <x-coredata:///Session/t3B6287B3-4478-4B64-9D83-9C85387C377D233>";
})'

但没有什么比一个会话更多。那是我没有正确设置关系并且使映射无法完全工作的线索。一旦我修复了一切都按预期工作。

这是会话关系属性的屏幕截图,一旦我检查了“对多关系”框,它就可以正常工作:

核心数据关系的 XCode 属性表

于 2013-06-20T01:00:49.693 回答