调用NSFetchRequest时对多对多关系进行排序

时间:2010-10-15 15:13:53

标签: iphone nsfetchrequest nssortdescriptor

我有两个实体。客户和项目。客户有许多项目,但项目只能分配给一个客户。这是使用datamodel设计的。

  • 客户实体具有 clientName 属性以及与多个项目的关系
  • 项目实体具有属性 projectName 并且与一个客户的关系

我想从我的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时有相应的功能。

2 个答案:

答案 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。这是在黑暗中的一点点,因为我自己没有尝试过,所以如果我错了就不要杀了我。