2016-01-20 249 views
2

我想弄清楚如何使用RestKit實現將API響應映射到CoreData對象。 API使用JSOG標準。這裏有一個例子:JSOG API對象的RestKit映射

[ 
    { 
     "@id": "1", 
     "name": "Sally", 
     "friend": { 
      "@id": "2", 
      "name": "Bob", 
      "friend": { 
       "@id": "3", 
       "name": "Fred", 
       "friend": { "@ref": "1" } 
      } 
     } 
    }, 
    { "@ref": "2" }, 
    { "@ref": "3" } 
] 

我將如何創建一個RKEntityMapping這種JSON?簡單屬性的映射很簡單,問題是如何在這裏設置關係,以便它們可以與@ref一起使用,當頂級用戶對象僅包含@ref時也是如此。

RKEntityMapping *userMapping = [RKEntityMapping mappingForEntityForName:@"Question" 
                inManagedObjectStore:[RKObjectManager sharedManager].managedObjectStore]; 

[userMapping addAttributeMappingsFromDictionary:@ 
{ 
    @"@id" : @"identifier", 
    @"name" : @"name" 
}]; 

[userMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"friend" 
                      toKeyPath:@"friend" 
                      withMapping:userMapping]]; 

我的猜測是,我可以使用下面的代碼來處理@ref內的物體:

[userMapping addConnectionForRelationship:@"friend" connectedBy:@{@"@ref": @"@id"}]; 

但它是正確的嗎?

  1. 怎麼會,我不是一個完整的對象或只是一個參考映射到一個已經提供的對象(通過@ref)實際核心數據對象?
  2. 如何將JSON的頂層元素(作爲User對象的列表)映射到User實體的實際列表?

回答

2

使用映射本身添加關係,所以它遞歸地進行鑽取。使用外鍵映射的參考。


在您的評論之後再看看它,它可能實際上是一個動態映射而不是外鍵的好候選。這意味着創建一個新的映射,它只是使用@"@ref" : @"identifier"作爲連接,而動態映射則查看關鍵字並決定使用此連接映射還是完整的userMapping

請注意,這兩種映射都需要指定identifier是對象的唯一鍵,並且您應該使用內存緩存來允許找到現有對象而不是創建重複項。

+0

感謝您的回答!我取得了進展,但我認爲我沒有完全掌握它。我更新了我的問題,澄清了我現在阻止了什麼。請看一看。我將如何創建外鍵映射? – RaffAl

+0

我和@Bearwithme處於同樣的境地,而Wain的命題就像是一種魅力!但是有一件事我想知道:是不是可以用'@'符號爲keypath加前綴? – ahaese

+0

我似乎記得它是一個問題,由於KVC @ahaese – Wain