簡體   English   中英

如何使用RestKit加載多個不相關的對象?

[英]How to load multiple unrelated objects with RestKit?

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

然后,我為一個對象#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方法加載多個不相關的對象,以便將它們正確加載到它們各自在CoreData中的表???

好吧,我認為restkit沒有什么可以區分公司和事件這兩種對象類型的。

有兩種解決方法。 兩者都很簡單,取決於您選擇什么:

  1. 您為公司和事件都提供了restkit的rootkeypath。 然后,您修改api以在json中包含rootkeypath。 像下面這樣。

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

    在這種情況下,restkit將知道哪個事件是什么,什么是公司,並將自動映射到正確的表。請查看rkgithub示例以獲取更多提示。

  2. 您將在線api設置為兩個都有兩個不同的URL。 因此,不同的URL將確保restkit不會混淆表。

在這里還要問的是,您的事件列中是否也包含公司名稱列? 因為我以為restkit會給您一個錯誤,因為從您的映射中來看,事件表中似乎沒有名為company name的列。 您是否正在嘗試在這里建立一對多關系? 公司有很多事件類型的事物。

您的地圖提供商需要進行調整-為每個地圖設置各自的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];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM