0

我需要使用 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];

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

虽然它为什么会发生是有道理的(数据对于公司开始加载并获得新的映射,所以它加载到错误的表中)问题是:如何调用loadObjectsAtResourcePath:remoteObjectPath方法来加载多个不相关的对象,以便它们可以正确加载到各自的表中在核心数据???

4

2 回答 2

0

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

有两种方法可以解决这个问题。两者都很简单,取决于您选择什么:

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

    ["company":{ "Backendid":1 "company name":"abc" } {"events":{ {Backendid":1 "description":"party" }]

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

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

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

于 2012-06-21T06:12:46.803 回答
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];
于 2012-07-02T20:59:02.673 回答