我需要加载多个没有关系但位于同一个远程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中各自的表中?
答案 0 :(得分:0)
我认为restkit没有什么可以区分两种对象类型公司和事件。
有两种方法可以解决这个问题。两者都很简单,由您决定:
您为公司和活动的restkit提供了rootkeypath。然后你修改你的api以在json中包含一个rootkeypath。像下面的东西..
[ “公司”:{ “Backendid”:1 “公司名称”:“abc” } { “事件”:{ {Backendid“:1 “说明”:“方” }]
在这种情况下,restkit将知道哪个是事件,什么是公司,并将自动映射到正确的表。结帐rkgithub示例以获取更多提示。
您将在线API设置为两个不同的网址。因此,不同的URL将确保restkit不会混淆表格。
此处还要问一下,您的活动列是否也有公司名称列?因为我认为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];