Core data 在添加SetRelationshipKeyPaths ForPrefetching后,Fetch一对多关系错误仍然显示

Core data 在添加SetRelationshipKeyPaths ForPrefetching后,Fetch一对多关系错误仍然显示,core-data,relationship,fetch,predicate,fault,Core Data,Relationship,Fetch,Predicate,Fault,假设我的数据模型有两个实体:部门和个人。部门与个人之间有一种称为“部门与个人”的关系。此人与部门之间有一种称为“personToDepartment”的一对一关系 我想填充一组属于选定部门的人员。要选择部门,我创建了一个UILabel,显示从弹出式表格视图中选择的部门名称。当我运行应用程序时,日志显示: personToDepartment.departmentName==实体: 部门id:0x8cc1920 ; 数据:{ 部门名称=市场营销; 部门人员= 我已经阅读了错误的目的,并实现了Set

假设我的数据模型有两个实体:部门和个人。部门与个人之间有一种称为“部门与个人”的关系。此人与部门之间有一种称为“personToDepartment”的一对一关系

我想填充一组属于选定部门的人员。要选择部门,我创建了一个UILabel,显示从弹出式表格视图中选择的部门名称。当我运行应用程序时,日志显示:

personToDepartment.departmentName==实体: 部门id:0x8cc1920 ; 数据:{ 部门名称=市场营销; 部门人员=

我已经阅读了错误的目的,并实现了SetRelationshipKeyPaths ForPreference,但我仍然得到了错误。我将在免责声明中声明我是新手,可能遗漏了一些明显的内容。当我删除谓词时,我的表视图将填充所有personName。代码如下:

- (NSFetchedResultsController *)fetchedResultsController {

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                entityForName:@"Person" inManagedObjectContext:_managedObjectContext];
    [fetchRequest setEntity:entity];


    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"personToDepartment.departmentName = %@", selectedDepartment];
    NSLog(@"predicate is: %@",predicate);

    [fetchRequest setPredicate:predicate];

    [fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects: @"departmentToPerson", nil]];

fetchRequest.returnsObjectsAsFaults = NO;

    NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                    initWithKey:@"personName" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];


    [fetchRequest setFetchBatchSize:20];


    NSFetchedResultsController *theFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
            managedObjectContext:_managedObjectContext sectionNameKeyPath:nil
                cacheName:nil];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;

}
同样,我从UILabel中选择了一个新部门,日志显示selectedDepartment,但随后说明关系错误,并且不填充表

提前感谢您的帮助

6月9日更新

我也发现这是有效的:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"personToDepartment = %@", selectedDepartment];

我也是CoreData的新手,但在我看来谓词是错误的。根据日志记录,您将要比较personToDepartment.departmentName和department对象。谓词应该如下所示: NSPredicate*谓词=[NSPredicate谓词格式:@personDepartment.departmentName=%@,selectedDepartment.departmentName]

但是有一个更好的方法。如果以前设置了关系,selectedDepartment.departmentToPerson将返回一个包含所有属于此部门的人员的NSSet。但是警告,如果您尝试NSLog@%@,selectedDepartment.departmentToPerson可能会出现关系错误,因为在您指定地址之前,CoreData不会提取NSSet中的c对象或通过它枚举。但例如NSLog@%d,selectedDepartment.departmentToPerson.count将强制CoreData进行获取,您将看到department中的人数

更新: NSSet为空可能是因为您在创建人员对象时未设置关系。将自动设置从部门到人员的反向关系

- (id)insertNewPerson:(NSDictionary *)personInfo inDepartment:(Department*)departmentObject 
{
    Person *personObject = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
    personObject.name = personInfo.name;
    personObject.departmentName = departmentObject.name;
    ...
    personObject.personToDepartment = departmentObject;   //this is RELATIONSHIP, if set, then you can access all persons from specific department by doing: departmentObject.departmentToPerson
}

bucherland这正是它所需要的,谢谢!我花了很多时间来解决这个问题。我会接受它,因为它回答了我的第一个问题。现在,我尝试了使用谓词的NSSet方法,但没有返回任何内容。我还需要为此添加更多内容吗?NSLog for count可以工作。很高兴它有帮助。selectedDepartment.depar创建Person.NSLog值为空时,您可能没有设置关系,因此ToPerson无法工作。