【问题标题】:Restkit - Core Data One-To-One Relationship Mapping via Foreign KeyRestkit - 通过外键进行核心数据一对一关系映射
【发布时间】:2014-02-13 01:49:29
【问题描述】:

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

但是,我碰了壁。

一些背景。

使用 Restkit 0.22 和 Core Data 来持久化 2 个对象并在它们之间建立关系。 我正在建模的两个对象如下,关系也包含在 COAgendaItem 和 COMapItemLocation 之间的一对一关系(目前不起作用的关系)和 COMapItemLocation 和 COAgendaItem 之间的一对多关系(我还没看过映射这个):

-- COAgendaItem

-- COMapItemLocation

它们具有相应的属性和关系

期望的结果是让核心数据关系与 RestKit 一起工作,即通过 COAgendaItem 对象上的代码可访问属性议程项目位置。

来自服务器的 JSON 响应如下所示

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

到目前为止,我已经修改了我的 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" 映射,这是必要的)

我试过修改[agendaItemMapping addConnectionForRelationship:@"agendaItemLocation" connectedBy:@"location_id"]; 包含我能想到的单个字符串和字典格式的所有组合的语句,即 @{"agendaItemLocation" : @"location_id"} 但无论我尝试什么,它总是以与之前相同的错误“无法连接关系:无效属性”结束为源实体“COAgendaItem”提供:location_id。

我完全被这个难住了,谁能指出我做错了什么或需要做不同的事情?

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

【问题讨论】:

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


    【解决方案1】:

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

    无法建立连接(并且出现错误),因为 RestKit 需要知道要查找(连接)的另一个对象的 id。您告诉它使用location_id,但它需要是类的属性(通常是瞬态的),而不是 JSON 中的项目(因为连接是在 JSON 被处理并消失后建立的)。

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

    【讨论】:

    • 嗨 Wain,感谢您迄今为止的帮助。我在 AgendaItem 中添加了一个名为 locationID 的属性,现在两个对象都有一个同名的属性,我修改了映射以反映这一点,它在启动时不再崩溃。但是我现在收到另一个错误“无法将托管对象上下文保存到持久存储”,对象显示 .locationID 属性已设置,但从关系(COAgendaItem.agendaItemLocation)派生的属性显示为 nil,任何想法是什么原因造成的?
    • 什么是保存错误?为映射打开跟踪日志记录。
    • 嗨,Wain,这有帮助吗? dropbox.com/s/ufeqvcato47dzsp/…
    • 我猜你的关系设置为必需的?您可能需要将其设为可选。
    • 嗨 Wain,再次感谢您的帮助。当更改为可选时,我不再收到错误,但议程项目位置(从位置派生的属性仍然为零)。似乎核心数据中的关系被完全忽略了,我仍然需要编写一些代码来通过 ID 查找位置并将其与 location_id 字段匹配。如果我不得不再次手动编写获取代码,那么到目前为止在 Restkit 中完成的工作似乎没有取得任何成果?
    猜你喜欢
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多