我目前在Core Data
数据库中有一些实体,Web API
后端服务JSON
。每个实体在服务器上都有一个单独的端点,它返回数据库中的所有这些实体,例如
.../api/student
.../api/teacher
.../api/degree
etc
JSON
被序列化以包含外键ID。以下是学生的示例回复:
[
{
"studentID" : 1,
"degree" : {
"degreeID" : 1
},
"name" : "My Name",
"teachers" : [
{ "teacherID" : 1 },
{ "teacherID" : 2 }
]
}
]
“学生,教师,学位”设计是一个虚构的例子,不幸的是真正的数据库更加复杂,“ one-to-many ”和“ many-to - 很多'的关系。
我是RestKit
的新手,并且不确定为Core Data请求和处理此数据的最佳方式。当应用程序启动时,我只需要应用程序更新其Core Data
数据库以匹配Web API
版本。有关如何最好地请求每个端点和处理映射的任何指导将非常感激。例如,在我导入JSON
之前,我是否需要已经请求并存储了学位和教师?我完全可以控制客户端和服务器。
修改:添加了示例代码
下面是一些类似于我的示例代码。我已经尝试了许多不同的方法(例如addRelationshipMappingWithSourceKeyPath和addConnectionForRelationship)来处理从学生到教师的“to-many”关系,但我似乎总是收到以下错误:
relationship 'teachers' fault on managed object
示例代码:
RKEntityMapping *studentMapping = [RKEntityMapping mappingForEntityForName:@"Student" inManagedObjectStore:managedObjectStore];
studentMapping.identificationAttributes = @[ @"id" ];
[studentMapping addAttributeMappingsFromDictionary:@{@"name" : @"name"}];
RKEntityMapping *teacherMapping = [RKEntityMapping mappingForEntityForName:@"Teacher" inManagedObjectStore:managedObjectStore];
tagMapping.identificationAttributes = @[ @"id" ];
[teacherMapping addAttributeMappingsFromDictionary:@{@"name" : @"name"}];
/*** RELATIONSHIP CONNECTION ***/
[studentMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"teachers" toKeyPath:@"id" withMapping:teacherMapping]];
/*** RESPONSE DESCRIPTORS ***/
RKResponseDescriptor *studentResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:studentMapping method:RKRequestMethodGET pathPattern:@"/api/student" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:studentResponseDescriptor];
RKResponseDescriptor *teacherResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:teacherMapping method:RKRequestMethodGET pathPattern:@"/api/teacher" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:teacherResponseDescriptor];
答案 0 :(得分:1)
处理每个响应时,将对现有对象建立关系。默认情况下会忽略不存在的对象。
您可以使用多个响应描述符来创建存根对象,以便创建关系,然后在以后填充对象详细信息。
一般情况下,我会有一个请求来获取“一切”的结构/关系。使用非常少的详细信息,然后在用户请求时填写详细信息。