如何根据相关对象集合的属性对Core Data结果进行排序?

时间:2012-10-05 14:55:40

标签: core-data nssortdescriptor

设置:我有一组父对象,称之为ObjectA。每个ObjectA与ObjectB具有一对多的关系。因此,一个ObjectA可能包含0..n ObjectB-s,并且每个ObjectB都有一个特定的ObjectA作为其父。

现在,我想对ObjectA-s进行Core Data提取,它们按照最新的ObjectB进行排序。是否可以为其创建排序描述符?

a related question描述了完全相同的情况。答案建议将ObjectB中的属性非规范化为ObjectA。如果用一次获取请求确实无法做到这一点,那就没问题了。

相关问题也提到:

  

实际上,我只是有个主意!也许我可以通过消息对对话进行排序。@ max.sortedDate ...

我试过了。这似乎不可能。我收到这个错误:

2012-10-05 17:51:42.813 xxx[6398:c07] *** Terminating app due to uncaught
exception 'NSInvalidArgumentException', reason: 'Keypath containing
KVC aggregate where there shouldn't be one; failed to handle
ObjectB.@max.creationTime'

将属性反规范化为ObjectA是唯一/最佳解决方案吗?

2 个答案:

答案 0 :(得分:0)

您可以在ObjectB中添加属性,这是添加日期的时间戳,然后在获取请求中,您可以执行以下操作:

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"objectB.addTime" ascending:YES];
...
fetchRequest.sortDescriptors = @[descriptor];

答案 1 :(得分:0)

我知道这个问题有点旧,但我所做的是获取所有ObjectB,迭代结果并提取ObjectB属性并将其添加到新数组中。

NSFetchRequest *fetchRequest = [NSFetchRequest new];
[fetchRequest setEntity:self.entityDescForObjectB];

// sort
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
[fetchRequest setSortDescriptors:@[sortDescriptor]];

NSError *error = nil;
NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
    NSLog(@"Error fetching objects: %@", error.localizedDescription);
    return;
}

// pull out all the ObjectA objects
NSMutableArray *tmp = [@[] mutableCopy];
for (ObjectB *obj in fetchedObjects) {
    if ([tmp containsObject:obj.objectA]) {
        continue;
    }
    [tmp addObject:obj.objectA];
}

这是有效的,因为CoreData是一个对象图,因此您可以向后工作。最后的循环基本上检查tmp数组是否已经有一个特定的ObjectA实例,如果没有,则将它添加到数组中。

对ObjectBs进行排序很重要,否则这个练习毫无意义。