Restkit - 通过外键进行核心数据一对一关系映射

时间:2014-02-12 14:52:58

标签: ios core-data restkit foreign-key-relationship

我花了最近几个小时通过查看已在StackOverFlow线程上解决的类似类似问题尝试了许多不同的解决方案。

然而,我碰到了一堵砖墙。

一些背景。

使用Restkit 0.22和核心数据来保留2个对象并在它们之间建立关系。 我正在建模的两个对象如下,关系也包含在COAgendaItem和COMapItemLocation(目前无法正常工作的关系)和COMapItemLocation与COAgendaItem之间的One-Many之间的One-One关系形式(I还没有考虑这个映射):

- COAgendaItem

enter image description here

- COMapItemLocation

enter image description here

他们有相应的属性和关系 enter image description here

期望的结果是使核心数据关系与RestKit一起工作,即可以通过COAgendaItem对象上的代码访问属性agendaItemLocation。

服务器的JSON响应如下所示

enter image description here

上面的JSON Response是COAgendaItem对象加上COMapItemLocation对象的主键所需的数据。我在映射location_id字段时遇到问题,该字段是COMapItemLocation的主键。 (我已经设置了响应描述符和检索代码,并且它正常工作,因为我试图映射关系,它只会成为一个问题)

到目前为止,我已经修改了我的RKEntityMapping来尝试映射关系。

+ (RKMapping *)agendaItemMapping{

RKEntityMapping *agendaItemMapping = [RKEntityMapping mappingForEntityForName:@"COAgendaItem" inManagedObjectStore:[[COPersistenceCoordinator sharedCOPersistenceCoordinator]restKitObjectStore]];
[agendaItemMapping addAttributeMappingsFromDictionary:@{@"id": @"agendaItemID",@"title": @"agendaItemTitle",@"description": @"agendaItemDescription",@"start": @"agendaItemStartTime",@"end": @"agendaItemEndTime",@"category": @"agendaItemCategory",@"location_id" : @"agendaItemLocation"}];
[agendaItemMapping addConnectionForRelationship:@"agendaItemLocation" connectedBy:@"location_id"];


return agendaItemMapping;

}

然而这会导致启动时崩溃,如下所示(注意,我已经添加了@“location_id”:@“agendaItemLocation”映射,也是必要的外键)

enter image description here

我尝试修改[agendaItemMapping addConnectionForRelationship:@"agendaItemLocation" connectedBy:@"location_id"]; 我可以用单个字符串和字典格式来考虑所有组合的声明,即@ {“agendaItemLocation”:@“location_id”}但无论我尝试什么,它总是以与之前相同的错误结束'无法连接关系:无效属性给予源实体'COAgendaItem':location_id'。

我完全被这个问题困扰,任何人都可以指出我做错了或需要采取不同的做法吗?

非常感谢您提前提供的任何帮助! :)

1 个答案:

答案 0 :(得分:1)

你描述了两种不同的关系,但实际上你只有一种反转关系。这是正确的,只是你的描述是错误的(因此可能是你对设置关系内容的理解)。

无法建立连接(并且您收到错误),因为RestKit需要知道要查找的其他对象的ID(连接到)。你告诉它使用location_id,但它需要是类的属性(通常是瞬态),而不是JSON中的项(因为连接是在JSON处理完毕后进行的)。

向实体添加属性以及将location_id放入其中的映射。使用该属性的名称更新连接。