다음 문제에 관해 안내해주세요. 이미지 RestKit 속성 매핑 및 관계 매핑 추가
내가 "목록"에 대해 다음 매핑을 사용하고 내 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]];
희망이 나를 밖으로 사람들과 관계 개념을 파악하는 데 도움이됩니다.
iOS는 반대의 관계가 있어야한다고 권장합니다. – Umair
@ Umair, 네가 맞아. :). 역관계를 제거하라는 제안은 가능한 한 코드를 적게하기위한 것이 었습니다. 그래서 디버깅은 쉬울 수 있습니다. 일들이 잘 작동하면 원하는대로 역관계를 추가 할 수 있습니다. 이 코드를 디버깅하는 방법 :) – Khawar
@Khawar 많은 설명 주셔서 감사합니다. – gbk