gpt4 book ai didi

iphone - NSFetchRequest/谓词问题

转载 作者:行者123 更新时间:2023-12-03 20:20:41 26 4
gpt4 key购买 nike

我有两个实体:Patient 和 Job。患者与作业具有一对多关系,称为“作业”,而作业与患者具有一对一关系,称为“患者”。作业具有名为“dueDate”(日期)和“已完成”(BOOL)的属性,而患者具有“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"];

这是我的 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];

这似乎不起作用。我是否以错误的方式处理这个问题?

最佳答案

怎么不工作了?它有助于描述您所看到的结果。

您没有将排序描述符添加到 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;

不需要需要转换[fetchedResultsController objectAtIndexPath:indexPath],因为它返回id。

从调用 [fetchedResultsController objectAtIndexPath:indexPath] 中您会得到什么?在这里放置一个断点并检查值并确保您返回的是 NSManagedObject 而不是 nil。在该方法中放置断点也将确认您正在被调用。

您的 secondaryKeypathName 将无法按上述方式工作。您可能希望将其设置为@"patent.lastName",以便它与我上面描述的初始排序相匹配。

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

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

最后,如果您希望该部分真正显示“姓氏,名字”格式,那么您需要在您的Patient上创建一个非 transient 派生值属性实体是 fullName ,以便您可以基于它创建缓存。每当名字或姓氏发生更改时,都需要更新此派生值。

关于iphone - NSFetchRequest/谓词问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2554266/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com