RestKit使用外键从JSON导入

时间:2014-05-06 12:33:48

标签: ios json entity-framework core-data restkit

我目前在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];

1 个答案:

答案 0 :(得分:1)

处理每个响应时,将对现有对象建立关系。默认情况下会忽略不存在的对象。

您可以使用多个响应描述符来创建存根对象,以便创建关系,然后在以后填充对象详细信息。

一般情况下,我会有一个请求来获取“一切”的结构/关系。使用非常少的详细信息,然后在用户请求时填写详细信息。