2013-04-12 4 views
1

핵심 데이터에 두 개의 테이블이 있습니다. 예를 들어 테이블 TA와 테이블 TB, TA는 TB와 일대 다 관계가 있습니다. TA에 하나의 레코드 A1이 있으며, for 루프의 TB 매핑에서 여러 레코드 (B1, B2, ..)를 갖고 싶습니다. 첫 번째 반복에서 db를 쿼리하고 A1을 가져오고 addTBObject : B1을 호출하고 컨텍스트를 저장하지 않았습니다. 다음 반복에서 A1을 얻기 위해 다시 쿼리하지만 nil을 반환합니다. (그래서 이상한 ...)CoreData 관계 저장 문제

첫 번째 인터렉션에서 컨텍스트를 저장하면 다음 반복에서 A1을 다시 얻는 것이 좋습니다. 하지만 이것은 더 나은 방법이라고 생각하지 않습니다. 하나의 루프에 많은 저장 작업이 발생하게됩니다.

아무도 도와 드릴 수 있습니까? 그것에 감사드립니다!

코드 추출물 :

NSString* objBId = @"xxx"; 
for (int i=0; i< [dataArray count]; i++) { 
    ObjA obj = [dataArray objectAtIndex:i]; 
    NSManagedObject* moObjA = [self getManagedObjAById:obj.objId inContext:context]; 
    if(moObjA) 
    { 
     NSManagedObject* moObjB = [self getManagedObjBById:objBId inContext:context]; 
     if (moObjB != nil) 
     { 
      [moObjB addAObject:moObjA]; 
      [self saveDB:context]; //if don't save here, moObjB will be nil in the next iteration... 
     } 
    } 
} 
+0

일부 코드를 공유하시기 바랍니다. – proxi

+0

방금 ​​업데이트되었습니다. 감사합니다. – ffprintf

+0

getManagedObj_ById가 올바르게 구현 되었습니까? 또한 관계가 다 대다로 올바르게 설정되어 있는지 확인하십시오. 그 외에는 의심스러운 것을 볼 수 없습니다. – proxi

답변

0

이 문제에 대한 실마리를 찾을 것으로 보인다. getManagedObjBById의 구현에서 매번 NSFetchRequest가 시작됩니다. 각 반복에서 커밋이 없으면 패치 요청은 다음 반복에서 nil을 반환합니다.

[NSFetchRequest fetchRequestWithEntityName : @ "TabelB"]를 사용하도록 코드를 변경 한 후 모든 설정이 완료되었습니다! for 루프는 더 이상 저장하지 않고 각 반복에서 항상 관리 객체 B를 가져올 수 있습니다.

더 자세히 살펴보면 특정 엔터티에 대한 NSFetchRequest는 커밋 (한 트랜잭션) 전에 한 번만 초기화 될 수 있다는 것을 의미합니까?

원산지 코드 : 이제

NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:@"xxx" inManagedObjectContext:context]]; 

:

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"xxx"];