2012-02-16 86 views
8

在閱讀Object Mapping-Guide on GitHub的RestKit後,我的問題沒有消失,所以也許有人可以說RestKit是否可以處理以下想法。沒有KVC的RestKit對象映射關係

實體關係

Company 
- unitID 
- companyID 
- name 
- contacts* (Company -->> Contact | 1:n) 

Contact 
- unitID 
- companyID 
- contactID 
- lastName 
- firstName 
- account* (Contact >--> Company | 1:1) 

JSON(公司)

[ 
    { 
     "unitID":"003CABD8DEB5DC13C", 
     "companyID":"BSP-002999", 
     "name":"Testcompany" 
    } 
] 

JSON(聯繫)

[ 
    { 
     "unitID":"DAC2ACCC125795D00", 
     "companyID":"BSP-002999", 
     "contactID":"CLP-015468", 
     "firstName":"Mister", 
     "lastName":"Wayne" 
    } 
] 

由於侷限性,我無法將所有聯繫人嵌入到公司中(否則我不會寫這些),所以我想在導入時映射數據時執行此操作。

問題

是否有可能映射每個聯繫人到它所屬公司進口(由屬性companyID標識)與RestKit給出的方法?

如果不是,我想知道它的最佳解決方案。謝謝!


背景

在我的這個應用程序的第一個構建我映射對象到指定的實體(無關係)的進賬都屬於接觸到公司的謂詞companyID =%@。由於大量的數據(4000+公司,7000+聯繫人)取得所有所有聯繫人需要大約一秒鐘 - 所以我想出了使用關係的想法(這適用於本地虛擬數據)。


解決方案

下面我目前的映射給出答案的幫助如下所示(RestKit第10節)。

// Setting up Restkit with objectStore 
... 

// Init objectMapping for Class Company 
companyMapping = [RKManagedObjectMapping mappingForClass:[Company class] inManagedObjectStore:objectStore]; 
[companyMapping mapKeyPath:@"unitID" toAttribute:@"unitID"]; 
[companyMapping mapKeyPath:@"companyID" toAttribute:@"companyID"]; 
[companyMapping mapKeyPath:@"name" toAttribute:@"name"]; 
companyMapping.setDefaultValueForMissingAttributes = NO; 
companyMapping.primaryKeyAttribute = @"companyID"; 

// Init objectMapping for Class Contact 
contactMapping = [RKManagedObjectMapping mappingForClass:[Contact class] inManagedObjectStore:objectStore]; 
[contactMapping mapKeyPath:@"unitID" toAttribute:@"unitID"]; 
[contactMapping mapKeyPath:@"companyID" toAttribute:@"companyID"]; 
[contactMapping mapKeyPath:@"contactID" toAttribute:@"contactID"]; 
[contactMapping mapKeyPath:@"lastName" toAttribute:@"lastName"]; 
[contactMapping mapKeyPath:@"firstName" toAttribute:@"firstName"]; 
contactMapping.setDefaultValueForMissingAttributes = NO; 
contactMapping.primaryKeyAttribute = @"contactID"; 

// Init relationships 
[contactMapping mapRelationship:@"company" withMapping:companyMapping]; 
[contactMapping connectRelationship:@"company" withObjectForPrimaryKeyAttribute:@"companyID"]; 

// Get objects from server 
... 

+0

可否請你分享這個例子中你的工作解決方案? :)僅供映射 – 2012-08-19 08:02:50

+2

使用示例配置更新了我的上面的條目。希望能幫助到你! – flashfabrixx 2012-08-20 09:12:54

回答

12

是,RestKit可以滋潤在映射時這種關係給你。在您RKManagedObjectMapping您的聯繫模式,你需要做到以下幾點:

  • 添加關係映射於母公司:[objectMapping mapRelationship:@"company" withMapping:companyMapping]
  • 地圖的companyID屬性到您接觸模型
  • 確保您有在這兩個類
  • 指示RestKit配置primaryKeyAttribute水合的關係:[objectMapping connectRelationship:@"company" withObjectForPrimaryKeyAttribute:@"companyID"];

RestKit具有後完成了一個有效載荷的映射,它將通過集合傳回並保存任何關係。處理被推遲到映射後,以防有效載荷實際上創建需要滿足連接的對象。

在開發分支上,可以使用替代工作流程。本週早些時候,我加入了支持在有效載荷中使用ID數組來保證多關係。這可以讓您將有效負載中屬於公司的聯繫人列表發送給負載。這對您的使用情況可能更有效。

從我的崗位到RestKit郵件列表的更多細節:http://groups.google.com/group/restkit/msg/416951f86b2862d1

+0

感謝您的快速重播 - 它的作用就像一個魅力!我現在正在觀看GitHub/Google上的項目,因爲對於這個項目來說,第二個想法似乎很棒。 – flashfabrixx 2012-02-16 22:31:42

+0

你救了我的一天! :)好像你需要在你的實體中指向你想要水合的父實體的外鍵。無論如何,我經歷了各種文檔和示例,但我不明白它的工作原理。這是迄今爲止關於如何最終讓這件事情起作用的最好解釋! – Hlung 2012-04-24 09:14:37