2014-04-10 4 views
0

중복 데이터를 줄이기 위해 User라는 상위 엔터티를 만들었습니다. 환자와 조산사는 모두 사용자의 자녀입니다.ManagedObject의 하위 엔터티 관계가 잘못된 개체를 제공합니다.

추가 자료는 조산사가 환자 세트를 갖고 환자가 조산아를 가질 수 있다는 것입니다. 내가 핵심 데이터에 대한 관리 객체를 채우는하고 때

Screenshot of the managed object when importing

는 올바른 개체에 대한 그들의 관계를 보여줍니다. 나는 ManagedObject의 관계가 (실제로 같은 ManagedObject를 가리키는) 잘못된 개체를 가리키는 사용자 클래스를 사용하여 객체를 검색 할 때

Screenshot of Core Data Model

문제이다.

내가 내가 내가 전화를 어떤 관계를 알 수 있도록 개체가 조산사 또는 환자 있는지 확인 내 도우미 방법을 사용하여 로그인 할 때 술어 NSString *predicateString = [NSString stringWithFormat:@"username == '%@' AND password == '%@'", username, password];

를 사용하여 핵심 데이터를 쿼리합니다. 그러나 그 관계는 그릇된 목적을 가리키고 있습니다.

[User userWithUsername:username 
       password:password 
       success:^(id user) {     
        if([user isKindOfClass:[Midwife class]]) 
        { 
         NSLog(@"Midwife : %@", [user fullName]); 
         dispatch_sync(dispatch_get_main_queue(), ^{ 
          [self performSegueWithIdentifier:@"midwifeDashboard" sender:self]; 
         }); 
        } 
        else if([user isKindOfClass:[Patient class]]) 
        { 
         NSLog(@"Patient : %@", [user fullName]); 
         dispatch_sync(dispatch_get_main_queue(), ^{ 
          [self performSegueWithIdentifier:@"patientDashboard" sender:self]; 
         }); 
        } 
       } 
       failure:^(NSError *error) { 
        NSLog(@"Error %@", [error description]); 
        dispatch_sync(dispatch_get_main_queue(), ^{ 
         [SVProgressHUD showErrorWithStatus:@"Invalid username or password"]; 
        }); 
       }]; 

개체가 어떤 클래스인지 알고 올바른 세그를 호출하지만 내 데이터와 해당 관계가 손상되는 곳입니다.

사용자 관리 개체에 조산사 관리 개체를 캐스팅했기 때문에 그것이 맞다고 생각하지만 어떻게해야합니까?

미리 감사드립니다.

편집

내가 그렇게

NSManagedObjectContext* context = [[[MDCDataStore sharedInstance] store] newPrivateContext]; 
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:entityName inManagedObjectContext:context]; 

[context performBlock:^{ 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    [fetchRequest setEntity:entityDescription]; 
    [fetchRequest setPredicate:predicate]; 
    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:nil]; 
}]; 

같은 가져 오기 요청이이 어질러 entityDescription 수 있을까 실시합니다?

+0

관계에 액세스하려고하는 곳은 어디입니까? 당신은 KindOfClass가 당신을 위해 일하고 있으며 어딘가에 당신이 User *에게 캐스팅하고 있다고 말합니다. 그러나 나는 그것을 보지 못합니다. – stevesliva

+0

@stevesliva 늦게 답장을 드려 죄송합니다. userWithUsername 메소드에서 질문에 표시된 술어를 사용하여 User 클래스에 쿼리합니다. 나는 그것을 User로 캐스팅하지 않으며, id로 다시 전달됩니다. 한 번만 isKindOfClass를 수행하면 클래스에 정확히 캐스팅됩니다. 그래서 올바른 메서드를 호출 할 수 있습니다. 비록 그것을 캐스팅하지 않고 id 유형의 사용자 객체를 사용하더라도 관계는 여전히 틀립니다. –

+0

어떤 점이 잘못되었는지 확인하려고합니다. 해당 객체가 관계에 대해 [선택] 또는 [오른쪽] 하위 클래스의 isKindOfClass를 응답하는 경우 여기에있는 코드에 문제가없는 것을 쉽게 알 수 없습니다. 물론 수퍼 클래스 메서드를 호출 할 수 있습니다. User 클래스 메소드의 하위 클래스에'self'를 캐스팅하고 있습니까? 반드시 문제가되는 것은 아닙니다. 여기에 표시되지 않기 때문에 *있을 수도 있습니다 ... – stevesliva

답변

0

아무 문제가 없습니다. 그것은 내가 NSLog 때 user.patients 속성이 잘못되었습니다. 내가 그들을 열거하면, 나는 정확하고 완전한 물건을 얻는다.

도움을 주신 모든 분들께 감사드립니다.