如何使用 RestKit 加载多个不相关的对象?

Posted

技术标签:

【中文标题】如何使用 RestKit 加载多个不相关的对象?【英文标题】:How to load multiple unrelated objects with RestKit? 【发布时间】:2012-06-20 18:56:15 【问题描述】:

我需要使用 RestKit 将多个没有关系但位于同一个远程 API 上的对象加载到 CoreData 中(换句话说,下载远程对象以在 ios 本地使用它们)

所以我已经设置了我的 Client 和 objectManager:

client = [RKClient clientWithBaseURL:[NSURL URLWithString:baseUrl]]; 
[client setUsername:@"someUsername"];
[client setPassword:@"somePassword"];

objectManager = [RKObjectManager managerWithBaseURLString:baseUrl];
[objectManager setClient:client];

然后我为一个 Object#1 设置一些映射:

RKManagedObjectMapping* companyMapping = [RKManagedObjectMapping mappingForEntityWithName:@"Company" inManagedObjectStore:objectManager.objectStore];
companyMapping.primaryKeyAttribute = @"backendID";
[companyMapping mapKeyPath:@"id" toAttribute:@"backendID"];
[companyMapping mapKeyPath:@"company_name" toAttribute:@"companyName"];

然后我为对象 #2 设置一些映射:

RKManagedObjectMapping* eventMapping = [RKManagedObjectMapping mappingForEntityWithName:@"Event" inManagedObjectStore:objectManager.objectStore];
eventMapping.primaryKeyAttribute = @"backendID";
[eventMapping mapKeyPath:@"id" toAttribute:@"backendID"];
[eventMapping mapKeyPath:@"description" toAttribute:@"eventDescription"];

之后我将 objectMapping 设置为 mappingProvider:

 [objectManager.mappingProvider setObjectMapping:companyMapping forResourcePathPattern:remoteObjectPath];
 [objectManager.mappingProvider setObjectMapping:eventMapping forResourcePathPattern:remoteObjectPath];

最后我为这两个对象一个接一个地调用“loadObjects...”:

[objectManager loadObjectsAtResourcePath:remoteCompaniesObjectPath delegate:self];
[objectManager loadObjectsAtResourcePath:remoteEventsObjectPath delegate:self];

此后,Company 和 Events 的数据以某种方式加载到 Events 表中,因此表数据完全无法使用。 如果我只运行loadObjectsAtResourcePath:remoteCompaniesObjectPath,那么一切都会按预期运行,远程 Company 对象会下载到 CoreData 中它自己的表中。

虽然它发生的原因是有道理的(数据对于公司开始加载并获得新的映射,因此它加载到错误的表),但 QUESTION 是: 如何调用loadObjectsAtResourcePath:remoteObjectPath 方法来加载多个不相关的对象,以便将它们正确加载到CoreData 中各自的表中???

【问题讨论】:

【参考方案1】:

我认为 restkit 没有什么可以区分公司和事件两种对象类型。

有两种方法可以解决这个问题。两者都很简单,由您决定:

    您为公司和活动提供了 restkit 的根密钥路径。然后你修改你的 api 以在 json 中包含一个 rootkeypath。像下面这样..

    [“公司”: “后端”:1 “公司名称”:“abc” “事件”: Backendid":1 “描述”:“聚会” ]

    在这种情况下,restkit 会知道哪个是事件,哪个是公司,并会自动映射到正确的表。查看 rkgithub 示例以获取更多提示。

    您将在线 api 设置为两者都有 2 个不同的 url。因此,不同的 URL 将确保 restkit 不会混淆表格。

还有一点要问的是,您的活动栏也有公司名称栏吗?因为我原以为 restkit 会给你一个错误,因为从你的映射来看,事件表中似乎没有名为 company name 的列。你想在这里建立某种对多的关系吗?公司有很多活动类型的东西。

【讨论】:

感谢您的建议,但是选项#1 不是很好,因为我在更改 API 方面没有太多影响力。选项 #2 听起来更好,但是两个远程对象已经有不同的 URL,请注意:loadObjectsAtResourcePath:remoteCompaniesObjectPath 和 loadObjectsAtResourcePath:remoteEventsObjectPath。所以公司的路径类似于:somedomain.com/api/companies... 和事件路径:somedomain.com/api/events.. 我认为这足以让 Restkit 区分,但事实并非如此。 Event 和 Company 对象之间也没有关系。【参考方案2】:

您的映射提供商需要进行调整 - 使用各自的 URL 设置每个映射。

从以下位置更改映射:

[objectManager.mappingProvider setObjectMapping:companyMapping forResourcePathPattern:remoteObjectPath];
[objectManager.mappingProvider setObjectMapping:eventMapping forResourcePathPattern:remoteObjectPath];

收件人:

[objectManager.mappingProvider setObjectMapping:companyMapping forResourcePathPattern: remoteCompaniesObjectPath];
[objectManager.mappingProvider setObjectMapping:eventMapping forResourcePathPattern:remoteEventsObjectPath];

【讨论】:

感谢您的建议,但在我的情况下,两个“remoteObjectPath”都是在调用该方法之前设置的不同字符串。它仍然没有按预期工作。它对你有用吗? " 如果我​​只运行 loadObjectsAtResourcePath:remoteCompaniesObjectPath 那么一切都按预期工作" 如果你只运行 loadObjectsAtResourcePath:remoteEventsObjectPath 是否也有效? 是的,使用一个映射提供程序对不同资源路径进行多个映射的场景对我有用。 RKGitHub 是这个问题的一个很好的参考:github.com/RestKit/RKGithub

以上是关于如何使用 RestKit 加载多个不相关的对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何递归加载RestKit中由外键标识的嵌套对象?

如何使用 Restkit 和 Core Data 存储对象和种子预加载数据

Restkit — 如何用可变键名映射 json 对象

iOS:RestKit 加载对象和发送参数

你如何在 RestKit 0.20 中使用 RKDotNetDateFormatter?

RestKit - 如何排队资源加载?