Основные данные: ошибка ключевого пути не найдена в объекте - PullRequest
15 голосов
/ 03 марта 2011

Может кто-нибудь сказать мне, что не так с этим кодом? Это вызывает следующую ошибку и вызывает сбой приложения:

reason: 'keypath Studies.patients.PatientName not found in entity <NSSQLEntity Studies id=3>'

Код:

 - (void)viewDidLoad {
        [super viewDidLoad];

        test_coredataAppDelegate *appDelegate = (test_coredataAppDelegate *)[[UIApplication sharedApplication] delegate];
        self.context = appDelegate.managedObjectContext;


        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription 
                                       entityForName:@"Studies" inManagedObjectContext:_context];
        [fetchRequest setEntity:entity];
        /**/
        NSLog(patientName);
        [fetchRequest setPredicate:[NSPredicate predicateWithFormat:
                               @"(Studies.patients.PatientName == %@ )",patientName]];



        NSError *error;
        self.StudiessList = [_context executeFetchRequest:fetchRequest error:&error];
        self.title = @"patients"; 
        [fetchRequest release];

    }

Ответы [ 2 ]

17 голосов
/ 03 марта 2011

Во-первых, поскольку ваша выборочная сущность имеет значение Studies, вы не включаете ее в предикат, потому что Studies объекты - это те, которые получают тест предиката в первую очередь.Таким образом, ваш предикат должен быть, по крайней мере, просто:

patients.PatientName == %@

Однако, по соглашению, patients будет означать отношение ко многим.Если это так, это означает, что фактическое значение patients представляет собой набор (предположительно) Patient объектов.Таким образом, вы не можете запросить набор для значения атрибута, как указано выше: Вместо этого вы должны запросить новый набор всех объектов в наборе, которые соответствуют предикату.Используйте оператор ЛЮБОЙ или Все, например:

ALL patients.PatientName == %@

Я бы добавил, что по соглашению все имена атрибутов и отношений начинаются со строчных букв, поэтому, если PatientName является атрибутом, он должен быть patientName.

6 голосов
/ 03 марта 2011

Либо у объекта «Исследования» нет свойства пациента, либо у объекта, на который указывают отношения с пациентами, нет свойства PatientName (обратите внимание на проблемы в верхнем / нижнем регистре) или оба.

...