核心数据:实体中未找到密钥错误<nssqlentity studies =“”id =“3”> </nssqlentity>

时间:2011-03-03 15:41:41

标签: objective-c core-data nspredicate nsfetchrequest

有没有人告诉我这段代码有什么问题?它引发以下错误并导致应用程序崩溃:

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];

    }

4 个答案:

答案 0 :(得分:17)

首先,由于您的获取实体是Studies,因此您不会在谓词中包含它,因为Studies对象是首先接收谓词测试的对象。所以你的谓词应该至少只是:

patients.PatientName == %@

但是,按惯例,patients表示一对多的关系。如果是这样,那意味着patients的实际值是一组(大概)Patient个对象。因此,您不能像上面那样向集合请求属性值:相反,您必须要求集合中与谓词匹配的所有对象的新集合。像这样使用ANY或All运算符:

ALL patients.PatientName == %@

我想按照惯例添加所有属性和关系名称都以小写字母开头,所以如果PatientName是一个属性,它应该是patientName

答案 1 :(得分:6)

研究实体没有患者财产,或患者关系指向的任何实体没有PatientName属性(注意大/小写问题)或两者兼而有。

答案 2 :(得分:0)

通常,当我看到此错误时,这意味着我向模型添加了新版本,但忘记为项目更新当前模型版本。

Screenshot of Xcode property

发布此答案以帮助我将来的自我,因为这不是我第一次进入此页面!

答案 3 :(得分:0)

就我而言,我引用了实体的超类属性,但没有在 xcdatamodel 文件中设置父实体。我必须从检查器菜单中选择我正在子类化的另一个 NSManagedObject(默认为无):

xcdatamodel snippet