2014-01-29 2 views
3

다음 문제에 관해 안내해주세요. 이미지 enter image description hereRestKit 속성 매핑 및 관계 매핑 추가

내가 "목록"에 대해 다음 매핑을 사용하고 내 AppDelegate에에 아이폰 OS 7 이제

와 RestKit의 최신 버전을 사용하고 다음과 같이

내가 관계와 두 기관이 법인

NSDictionary *listObjectMapping = @{ 
             @"listID" : @"listID", 
             @"listName" : @"listName", 
             @"listSyncStatus" : @"listSyncStatus" 
           }; 

RKEntityMapping *listEntityMapping = [RKEntityMapping mappingForEntityForName:@"List" inManagedObjectStore:managedObjectStore]; 
[listEntityMapping addAttributeMappingsFromDictionary:listObjectMapping]; 

listEntityMapping.identificationAttributes = @[ @"listID" ]; 

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:listEntityMapping 
                         method:RKRequestMethodGET 
                        pathPattern:@"/api/lists" 
                         keyPath:nil 
                        statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[objectManager addResponseDescriptor:responseDescriptor]; 


//Inverse mapping, to perform a POST 
RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[listEntityMapping inverseMapping] 
                       objectClass:[List class] 
                       rootKeyPath:nil 
                        method:RKRequestMethodPOST]; 
objectManager.requestSerializationMIMEType = RKMIMETypeJSON; 
[objectManager setAcceptHeaderWithMIMEType:RKMIMETypeJSON]; 

[RKMIMETypeSerialization registerClass:[RKNSJSONSerialization class] forMIMEType:@"application/json"]; 
[objectManager addRequestDescriptor:requestDescriptor]; 



//Inverse mapping, to perform a PUT 
requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[listEntityMapping inverseMapping] 
                       objectClass:[List class] 
                       rootKeyPath:nil 
                        method:RKRequestMethodPUT]; 
objectManager.requestSerializationMIMEType = RKMIMETypeJSON; 
[objectManager setAcceptHeaderWithMIMEType:RKMIMETypeJSON]; 

[RKMIMETypeSerialization registerClass:[RKNSJSONSerialization class] forMIMEType:@"application/json"]; 
[objectManager addRequestDescriptor:requestDescriptor]; 
내 작업 개체에 대해 다음과 같은 매핑을 사용

NSDictionary *taskObjectMapping = @{ 
            @"listID" : @"listID", 
            @"taskID" : @"taskID", 
            @"taskName" : @"taskName", 
            @"taskCompletionStatus" : @"taskCompletionStatus", 
            @"taskSyncStatus" : @"taskSyncStatus" 
           }; 

RKEntityMapping *taskEntityMapping = [RKEntityMapping mappingForEntityForName:@"Task" inManagedObjectStore:managedObjectStore]; 
[taskEntityMapping addAttributeMappingsFromDictionary:taskObjectMapping]; 
taskEntityMapping.identificationAttributes = @[ @"taskID" ]; 


RKResponseDescriptor *taskResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:taskEntityMapping 
                          method:RKRequestMethodGET 
                         pathPattern:@"/api/list/:id" 
                          keyPath:nil 
                         statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[objectManager addResponseDescriptor:taskResponseDescriptor]; 


//Inverse mapping, to perform a POST 
RKRequestDescriptor *taskRequestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[taskEntityMapping inverseMapping] 
                       objectClass:[Task class] 
                       rootKeyPath:nil 
                        method:RKRequestMethodPOST]; 
objectManager.requestSerializationMIMEType = RKMIMETypeJSON; 
[objectManager setAcceptHeaderWithMIMEType:RKMIMETypeJSON]; 
[RKMIMETypeSerialization registerClass:[RKNSJSONSerialization class] forMIMEType:@"application/json"]; 
[objectManager addRequestDescriptor:taskRequestDescriptor]; 



//Inverse mapping, to perform a PUT 
taskRequestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[taskEntityMapping inverseMapping] 
                  objectClass:[Task class] 
                  rootKeyPath:nil 
                   method:RKRequestMethodPUT]; 
objectManager.requestSerializationMIMEType = RKMIMETypeJSON; 
[objectManager setAcceptHeaderWithMIMEType:RKMIMETypeJSON]; 
[RKMIMETypeSerialization registerClass:[RKNSJSONSerialization class] forMIMEType:@"application/json"]; 
[objectManager addRequestDescriptor:taskRequestDescriptor]; 

이제 내 질문은이 두 가지 entite간에 관계 매핑을 추가하는 방법입니다. 올바른 방법은 무엇입니까?

나는 코드

[taskEntityMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"list.listID" 
                        toKeyPath:@"listID" 
                       withMapping:listEntityMapping]]; 

런타임 오류가

"키 패스 listID에 대한 매핑을 추가 할 수 없습니다 은, 하나는 이미 존재"나는이

을 사용하면 말 발생의 다음 줄을 사용하여 사용하는 경우

이 오류로 인해 응용 프로그램이 작동하지 않습니다. 엔티티 목록이 t의 키 값 코딩을 준수하지 않습니다. 그는 "list"키를. "

와 내가 위의 코드를 생략하고 관계

task.list.listID 

에서 listID를 얻을하려고하면 그것은 나에게 "0"을 제공합니다. 누구든지 정확하게 내가 뭘 잘못하고 있는지 또는 위의 작업을 수행하기 위해 무엇을해야하는지 말해 줄 수 있습니다. 필요한 경우 이에 대한 자세한 내용을 제공 할 수 있습니다.

편집

하지만 모든 목록을 반환 나의 요청

GET www.mydomain.com/api/list/42 
[ 
{"taskID":"22","listID":"42","taskName":"Task 2","taskSyncStatus":"1","taskCompletionStatus":"1"}, 

{"taskID":"21","listID":"42","taskName":"Task 1","taskSyncStatus":"1","taskCompletionStatus":"1"} 
] 

예를 다음과 같이 케스 케이 딩이없는 그 작업을 반환합니다 JSON을

GET www.mydomain.com/api/lists 

[ 
{"listID":"42","listName":"List 4","listSyncStatus":"1"}, 
{"listID":"41","listName":"List 3","listSyncStatus":"1"}, 
{"listID":"40","listName":"List 2","listSyncStatus":"1"} 
] 

단일 목록 요청에 따라 json에서 반환 된 관계. 이 잘못된 길입니까, 아니면 제가 여기서 누락되어 있습니까?

그것은 내가 즉, JSON 잘못을 반환되었다 밝혀 대답

접수 후 수정아이폰 OS 모델은 관계의 "작업"을 가지고있는 동안 반환 된 JSON 그것에 아무 관계가 없습니다 그래서 난 중첩 된 JSON 위에 복귀 후 아래

[ { "listID" : "96", 
    "listName" : "List 1", 
    "listSyncStatus" : "1", 
    "tasks" : [ { "taskCompletionStatus" : "1", 
      "taskID" : "67", 
      "taskName" : "Task 2", 
      "taskSyncStatus" : "1" 
     }, 
     { "taskCompletionStatus" : "1", 
      "taskID" : "66", 
      "taskName" : "Task 1", 
      "taskSyncStatus" : "1" 
     } 
     ] 
    }, 
    { "listID" : "97", 
    "listName" : "List 2", 
    "listSyncStatus" : "1", 
    "tasks" : [ { "taskCompletionStatus" : "1", 
      "taskID" : "69", 
      "taskName" : "Task 1", 
      "taskSyncStatus" : "1" 
     }, 
     { "taskCompletionStatus" : "1", 
      "taskID" : "68", 
      "taskName" : "Task 1", 
      "taskSyncStatus" : "1" 
     } 
     ] 
    } 
] 

처럼 올바른 중첩 된 JSON을 반환하는 내 나머지 API를 편집, 모든 매력처럼 작동 , 특별히이 줄

[listEntityMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"tasks" 
                        toKeyPath:@"tasks" 
                       withMapping:taskEntityMapping]]; 

희망이 나를 밖으로 사람들과 관계 개념을 파악하는 데 도움이됩니다.

답변

5

당신 모달 그림은 당신이 많은 한 -에 - 관계 (한 목록이 이 있음을 보여줍니다 많은 작업).

는 지금까지 내가 아는 한,이 경우 당신은 목록에만 엔티티, 작업 기업에 필요 없음을 관계 매핑을 추가해야합니다. 일대 다 관계에 대해서도 Task 엔티티에 list 관계를 추가 할 필요가 없습니다.

귀하의 실체 관계는 그래서 위의 방법에서

[listEntityMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"YOUR_JSON_KEYPATH_HERE" toKeyPath:@"tasks" withMapping: taskEntityMapping]]; 

중요

다음과 같은 노력이

enter image description here

과 같아야합니다

FromKeyPath parameter은 관계가 시작되는 JSON key의 이름이어야합니다.

toKeyPath parameter은 엔터티 다이어그램에서 언급 한 relationship name이어야합니다. 즉; tasks.

withMapping은 많은 엔티티의 매핑이어야합니다. 혹시라도 taskEntityMapping

호프가이 문제를 해결했습니다.

+2

iOS는 반대의 관계가 있어야한다고 권장합니다. – Umair

+0

@ Umair, 네가 맞아. :). 역관계를 제거하라는 제안은 가능한 한 코드를 적게하기위한 것이 었습니다. 그래서 디버깅은 쉬울 수 있습니다. 일들이 잘 작동하면 원하는대로 역관계를 추가 할 수 있습니다. 이 코드를 디버깅하는 방법 :) – Khawar

+0

@Khawar 많은 설명 주셔서 감사합니다. – gbk

0

확실하지 않음이 작동하지 않습니다,하지만 당신은 이런 관계 매핑을 만들려고 이유 :

[taskEntityMapping addConnectionForRelationship:@"list" connectedBy:@{ @"listId": @"listId" }]; 
[listEntityMapping addConnectionForRelationship:@"tasks" connectedBy:@{ @"listId":@"listId"}];