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

时间:2012-06-20 18:56:16

标签: objective-c ios rest core-data restkit

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

所以我设置了我的客户端和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"];

然后我为Object#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];

在此之后,来自公司和事件的数据以某种方式加载到事件表中会发生什么,因此表数据完全无法使用。 如果我只运行loadObjectsAtResourcePath:remoteCompaniesObjectPath,那么一切都按预期工作,远程公司对象会下载到CoreData中自己的表中。

虽然它确实有意义(为公司开始加载和获取新映射的数据,因此它加载到错误的表格),问题是: 如何调用loadObjectsAtResourcePath:remoteObjectPath方法加载多个不相关的对象,以便将它们正确加载到CoreData中各自的表中?

2 个答案:

答案 0 :(得分:0)

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

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

  1. 您为公司和活动的restkit提供了rootkeypath。然后你修改你的api以在json中包含一个rootkeypath。像下面的东西..

    [ “公司”:{              “Backendid”:1               “公司名称”:“abc”              }     { “事件”:{             {Backendid“:1               “说明”:“方”             }]

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

  2. 您将在线API设置为两个不同的网址。因此,不同的URL将确保restkit不会混淆表格。

  3. 此处还要问一下,您的活动列是否也有公司名称列?因为我认为restkit会给你一个错误,因为你的映射似乎没有在事件表中命名公司名称的列。你想在这里做某种多对多的关系吗?公司有很多事件类型的东西。

答案 1 :(得分:0)

您的地图提供商需要进行调整 - 使用各自的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];