我有一个继承自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 => ()
映射?如何使映射继承工作?
答案 0 :(得分:2)
简而言之,它不起作用,因为RestKit不支持它,在我看来不应该。
如果您希望子映射具有父映射,您也可以将它添加到子映射中,如果您单独编写它们,则只需添加一行代码,如果您使用{,则只需添加一些额外字符{1}}方法。
关于您的具体示例,有一点很重要。一个是你不应该使用'id'作为你的属性名,因为id是在ObjC中保留的(我不是肯定的,它实际上会导致问题,但至少在代码中看是令人困惑的)。
因此,RestKit中有一个标准的约定来映射“id”属性,即将实体的名称添加到属性中,即mapKeyPathsToAttributes:
将具有Parent
属性和{{ 1}}将具有parentID
属性。仅这就说明了为什么继承这些属性(特别是主键!)在一般情况下不是一个好主意。
此外,为RESTful服务器提供某种基于SQL的后端是很常见的,它可能支持也可能不支持Core Data所具有的实体继承类型,因此可以假定对象从设备映射到数据的方式服务器。例如,Rails在一定程度上处理STI,但任何比这更复杂的东西都需要宝石或黑客。
编辑:(取自github问题) 如果有人发现这是寻找继承的方法,那么有一种相对简单的方法来创建基于其他映射的映射:
Child