NSFetchRequest/Predicate问题

Gar*_*tet 2 iphone core-data objective-c uitableview nsfetchedresultscontroller

我有两个实体:患者和工作.患者与Job有很多关系称为"工作",Job与患者有一对一的关系称为"患者".Job具有名为'dueDate'(Date)和'completed'(BOOL)的属性,Patient具有属性'firstName'和'lastName'(两个字符串).

我正在尝试为我的NSFetchedResultsController创建一个获取请求/谓词,我们抓取所有尚未完成的作业(即已完成==否)并按患者姓名划分它们.这是我的代码:

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"];
Run Code Online (Sandbox Code Playgroud)

这是我的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];
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用.我是以错误的方式来做这件事的吗?

Mar*_*rra 6

怎么不行?它有助于描述您所看到的结果.

您没有将排序描述符添加到NSFetchRequest中,至少在您提供的示例中是这样.

您的排序描述符无效.看起来这Patient是一种关系,所以对这种关系进行排序是行不通的.您可能希望进行如下排序:

NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"patient.lastName" ascending:YES];
NSSortDescriptor *firstNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"patient.firstName" ascending:YES];
NSSortDescriptor *dueDateDescriptor = [[NSSortDescriptor alloc] initWithKey:@"dueDate" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects: lastNameDescriptor, firstNameDescriptor, dueDateDescriptor, nil];

[fetchRequest setSortDescriptors:sortDescriptors];

[lastNameDescriptor release], lastNameDescriptor = nil;
[firstNameDescriptor release], firstNameDescriptor = nil;
[dueDateDescriptor release], dueDateDescriptor = nil;
Run Code Online (Sandbox Code Playgroud)

不是要投[fetchedResultsController objectAtIndexPath:indexPath],因为它返回的ID.

你有什么回电话[fetchedResultsController objectAtIndexPath:indexPath]?在这里放置一个断点并检查值,确保你得到的是一个NSManagedObject而不是零.在该方法中设置断点也将确认您正在被调用.

您的secondKeypathName将无法正常工作.您可能希望将其设置为@"patient.lastName"与上面描述的初始排序相匹配.

-tableView: titleForHeaderInSection:应该访问由提供的缓存NSFetchedResultsController而不是假设该部分中将有一行:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{
    id sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo name];
}
Run Code Online (Sandbox Code Playgroud)

最后,如果您希望该部分真正显示"lastname,firstname"格式,那么您需要在实体上创建一个非瞬态派生值属性,以便您可以基于它创建缓存.然后,只要更改了名字或姓氏,就需要更新此派生值.PatientfullName