我有两个实体。客户和项目。客户有许多项目,但项目只能分配给一个客户。这是使用datamodel设计的。
我想从我的ManagedObjectContext中检索所有客户端,其中客户端按 clientName 升序排序,然后通过 projectName 升序。
这是我当前的代码,我知道这是错误的,因为客户端实体无法按 projectName 进行排序:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
// Creating the sort descriptors array.
NSSortDescriptor *clientSort = [[NSSortDescriptor alloc] initWithKey:@"clientName" ascending:YES];
// this next row is super wrong
NSSortDescriptor *projectSort = [[NSSortDescriptor alloc] initWithKey:@"projectName" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:clientSort. projectSort, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSError *error;
// Assign to NSArray of ViewController
clientArray = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
在将此分配给clientArray
之后,我想转到另一种方法并询问项目并按升序排列。例如:
Client *temp = (Client *)[clientArray objectAtIndex:selectedClient];
NSArray *projectsArray = [temp.projects allObjects];
Project *project = [projectsArray objectAtIndex:selectedProject];
return project.projectName;
我看到了一个实现,他们获得了客户端,然后手动对项目进行了排序......但这有点贵,我希望在查询Context时有相应的功能。
答案 0 :(得分:0)
您可以将自己的自定义属性添加到Client
@interface Client : NSManagedObject {
}
// ... other properties
@property (nonatomic,readonly) NSArray* orderedProjects;
@end
@implementation
// ... @dynamic etc
@dynamic orderedProjects;
- (NSArray*)orderedProjects {
NSArray* sort = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"projectName" ascending:YES]]
return [[self.projects allObjects] sortedArrayUsingDescriptors:sort];
}
@end
现在你只需要获取所有客户端,现在每个客户端都有已排序的项目。性能明智我不确定这是最好的方法,但它让我认为代码更清晰。
答案 1 :(得分:-1)
尝试使用排序的密钥路径,例如排序描述符中的project.projectName
。这是在黑暗中的一点点,因为我自己没有尝试过,所以如果我错了就不要杀了我。