我正在尝试使用共享管理器在一个 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
但没有设置房间关系。
所以问题是,为什么有些会话映射正确而其他会话不正确?