我有两个实体:耐心和工作。患者与Job有一对多的关系,称为“工作”,而Job与患者具有一对一的关系,称为“患者”。 Job具有名为“ dueDate”(日期)和“ completed”(BOOL)的属性,而Patient具有“ firstName”和“ lastName”(均为字符串)的属性。
我正在尝试为我的NSFetchedResultsController创建一个获取请求/谓词,以获取所有尚未完成的作业(即已完成== NO),并按患者名称进行划分。这是我的代码:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Job" inManagedObjectContext:moc];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(completed == NO)"];
[fetchRequest setPredicate:predicate];
NSSortDescriptor *patientDescriptor = [[NSSortDescriptor alloc] initWithKey:@"patient" ascending:YES];
NSSortDescriptor *dueDateDescriptor = [[NSSortDescriptor alloc] initWithKey:@"dueDate" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:patientDescriptor, dueDateDescriptor, nil];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:moc sectionNameKeyPath:@"patient" cacheName:@"Jobs"];
这是我的titleForHeaderInSection方法:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:section];
NSString *firstName = [[(Job *)[fetchedResultsController objectAtIndexPath:indexPath] patient] firstName];
NSString *lastName = [[(Job *)[fetchedResultsController objectAtIndexPath:indexPath] patient] lastName];
return [NSString stringWithFormat:@"%@ %@", firstName, lastName];
这似乎不起作用。我会以错误的方式处理吗?
最佳答案
首先,您似乎没有将sortDescriptors附加到fetchRequests。这可能会或可能不会与问题有关。
其次,您可以通过一种更简单的方式来完成此任务。使它像这样:
sectionNameKeyPath:@"patient.name"
“名称”应该是Patient对象的属性或方法。一种简单的实现方法是对患者使用类别方法:
- (NSString *)name {
return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];
}
实际上,您无法通过这样简单的事情来实现您的目的,请阅读mzarra的答案以获取正确答案。 NSFetchedResultsController有以下重要评论:
如果控制器生成节,则使用数组中的第一个排序描述符将对象分组为节;其键必须与sectionNameKeyPath相同,或者使用其键的相对顺序必须与使用sectionNameKeyPath的相对顺序匹配。
但是,您无法对方法调用的结果进行排序,需要对象的属性。因此,最好的选择可能是在“患者”上具有“名称”属性,并将该属性用于sorting和sectionNameKeyPath。