Restkit - 子映射不继承其父映射?

时间:2012-07-19 10:08:28

标签: objective-c core-data inheritance mapping restkit

我有一个继承自Parent的{​​{1}}模型,以及一个继承自NSManagedObject的{​​{1}}模型。

以下是Child映射:

Parent

Parent映射:

RKManagedObjectStore* store = [RKObjectManager sharedManager].objectStore;
RKManagedObjectMapping* mapping = [RKManagedObjectMapping mappingForEntityWithName:@"Parent" inManagedObjectStore:store];
[mapping mapKeyPath:@"id" toAttribute:@"id"];
[[RKObjectManager sharedManager].mappingProvider addObjectMapping:mapping];

然后,当我尝试将以下JSON对象映射到Child实例时:

RKManagedObjectStore* store = [RKObjectManager sharedManager].objectStore;
RKManagedObjectMapping* mapping = [RKManagedObjectMapping mappingForEntityWithName:@"Child" inManagedObjectStore:store];
[[RKObjectManager sharedManager].mappingProvider setMapping:mapping forKeyPath:@"child"];

在RestKit跟踪中,我看到Child的以下映射:

{
  "child": {
    "id": 7
  }
}

为什么Child映射不会继承mappings => () 映射?如何使映射继承工作?

1 个答案:

答案 0 :(得分:2)

简而言之,它不起作用,因为RestKit不支持它,在我看来不应该。

如果您希望子映射具有父映射,您也可以将它添加到子映射中,如果您单独编写它们,则只需添加一行代码,如果您使用{,则只需添加一些额外字符{1}}方法。

关于您的具体示例,有一点很重要。一个是你不应该使用'id'作为你的属性名,因为id是在ObjC中保留的(我不是肯定的,它实际上会导致问题,但至少在代码中看是令人困惑的)。

因此,RestKit中有一个标准的约定来映射“id”属性,即将实体的名称添加到属性中,即mapKeyPathsToAttributes:将具有Parent属性和{{ 1}}将具有parentID属性。仅这就说明了为什么继承这些属性(特别是主键!)在一般情况下不是一个好主意。

此外,为RESTful服务器提供某种基于SQL的后端是很常见的,它可能支持也可能不支持Core Data所具有的实体继承类型,因此可以假定对象从设备映射到数据的方式服务器。例如,Rails在一定程度上处理STI,但任何比这更复杂的东西都需要宝石或黑客。

编辑:(取自github问题) 如果有人发现这是寻找继承的方法,那么有一种相对简单的方法来创建基于其他映射的映射:

Child