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)
这似乎不起作用.我是以错误的方式来做这件事的吗?
怎么不行?它有助于描述您所看到的结果.
您没有将排序描述符添加到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"格式,那么您需要在实体上创建一个非瞬态派生值属性,以便您可以基于它创建缓存.然后,只要更改了名字或姓氏,就需要更新此派生值.Patient
fullName
归档时间: |
|
查看次数: |
7487 次 |
最近记录: |