2012-08-31 6 views
4

Ray Wenderlich's new tutorial 다음으로 JSON 데이터를 가져 와서 코어 데이터에 저장할 수있었습니다. 코어 데이터의 관계를 통해이를 수행하는 방법을 이해하는 데 어려움을 겪고 있습니다. 여기 JSON과 관계가있는 코어 데이터

enter image description here

내 JSON입니다 :

{ 
    "results": [ 
     { 
     "name": "Trivia 1", 
     "objectId": "1000", 
     "createdAt": "2012-08-31 18:02:52.249 +0000", 
     "updatedAt": "2012-08-31 18:02:52.249 +0000", 
     "questions": [ 
      { 
       "text": "Question 1" 
      }, 
      { 
       "text": "Question 2" 
      }, 
      { 
       "text": "Question 3" 
      } 
     ] 
     } 
    ] 
} 

그리고 마지막으로 여기에 내가 managedObject의 값으로 설정 곳이다 :

//Sets values for ManagedObject, also checks type 
    - (void)setValue:(id)value forKey:(NSString *)key forManagedObject:(NSManagedObject *)managedObject { 

     NSLog(@"TYPE: %@", [value class]); 

     //If managedObject key is "createdAt" or "updatedAt" format the date string to an nsdate 
     if ([key isEqualToString:@"createdAt"] || [key isEqualToString:@"updatedAt"]) { 
      NSDate *date = [self dateUsingStringFromAPI:value]; 
      //Set date object to managedObject 
      [managedObject setValue:date forKey:key]; 
     } else if ([value isKindOfClass:[NSArray class]]) { //<---This would be the array for the Relationship 
      //TODO: If it's a Dictionary/Array add logic here 
      for(NSDictionary *dict in value){ 
       NSLog(@"QUESTION"); 
      } 
     } else { 
      //Set managedObject's key to string 
      [managedObject setValue:value forKey:key]; 
     } 
    } 

I를 여기

내 데이터 모델입니다 this question을 살펴 보았습니다. 그러나 나는 정말로 혼란스러워합니다. 레이 Wenderlich 예제에서 함께 조각을 연결합니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

6

for 루프에서 몇 가지 특수 처리를 할 것입니다. QuestionGroup을 다루는 경우 해당 객체의 배열이 질문입니다 (단 하나의 배열이라고 가정 함). 그러면 새 배열을 만들 수 있습니다 사전의 각 항목에 대한 질문 객체입니다. 이것은 동기화 엔진의 일반성을 무너 뜨릴 것입니다.하지만 원하는 경우 몇 가지 추가 단계를 거쳐 다시 얻을 수 있습니다.

else if ([value isKindOfClass:[NSArray class]]) { 
    if ([[managedObject entity] name] isEqualToString:@"QuestionGroup") { 
     NSSet *questions = [NSMutableSet set]; 
     for (NSDictionary *question in value) { 
      // create your question object/record 
      NSManagedObject *questionManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"Question" inManagedObjectContext:managedObjectContext]; 
      // setup your question object 
      questionManagedObject.text = [question valueForKey:@"text"]; 
      // store all the created question objects in a set 
      [questions addObject:questionManagedObject]; 
     } 
     // assign the set of questions to the relationship on QuestionGroup 
     [managedObject setValue:questions forKey:@"questions"]; 
    } 
} 
+0

감사 봐, 이것은 내가 지금 필요한 작동하게한다. 나는 미래에 필요할 때 더 유연하게 작업 할 것입니다. – mkral

+0

이 코드는 동기화 할 때 중복 된 관리 대상 객체를 어떻게 처리합니까? 이 코드가 실행될 때마다 새로운 객체를 삽입하는 것처럼 보입니다. – bluemoon

+0

이 블록은이를 처리하지 않습니다. 동기화 중에 데이터 복제가 처리되어야합니다. –

0

저는 이것을 처리하기 위해 과거에는 restkit을 사용했습니다. 내가 뭘하고 있었는지에 대해 꽤 무겁다 고 느꼈지만 이제는 같은 문제를 해결해야하는 또 다른 프로젝트에서 일하고 있으므로 더 잘 작동 할만한 것은 없다. Restkit을 한번 더 가라 앉힐 시간을 맞춰라.

http://restkit.org

+0

어제 저는 실제로 어제 restkit을 배우기 시작했습니다. Magical Record를 사용하는 것이 다소 혼란스럽고 이미 AFNetworking 요청을 구현했습니다. 나는 온라인 자원이 매우 유용하다는 것을 알지만 항상 그것을 처리 할 필요가있는 것은 아니다. – mkral