核心数据:按多对数关系排序

时间:2010-10-10 03:10:13

标签: iphone cocoa core-data nsfetchedresultscontroller

我目前正在尝试设置一个NSFetchedResultsController,它将根据多对多关系中的实体数量来命令我的表视图。我不确定这在计算时是否有所不同,但这也是一种反比关系。

我认为这样的事情会好起来的:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Parent"
inManagedObjectContext:managedObjectContext];

NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] 
initWithKey:@"children.@count" ascending:YES];

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,
nil];

[fetchRequest setSortDescriptors:sortDescriptors];

我不断得到'含有KVC聚集体的Keypath,而不应该有一个;未能处理孩子。@ count'。

关于可能出现什么问题的任何想法?

4 个答案:

答案 0 :(得分:3)

据我所知,您无法在查询中应用@count,但您可以轻松地将其应用于获取的数组。

NSEntityDescription * entity = [NSEntityDescription entityForName:@"Parent" inManagedObjectContext:self.managedObjectContext];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
NSError *error;
NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"children.@count" ascending:NO];
NSArray *descriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
NSArray *sortedArray  = [results sortedArrayUsingDescriptors:descriptors];

答案 1 :(得分:1)

我将KVO访问器-countOf<Key>作为属性添加到我的托管对象模型中作为整数类型。我没有在NSManagedObject子类中为此属性实现任何内容,因为所有的魔法似乎都在幕后发生。

因此,在此特定情况下,将属性countOfChildren添加到Parent实体。这应该删除异常。

编辑:此修补程序似乎仅适用于iOS 6.1,而不适用于iOS 6.0。

答案 2 :(得分:1)

从iOS 13(和朋友)开始,您可以使用派生表达式childCount创建一个名为children.@count的{​​{3}},然后设置fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"childCount" ascending:NO]]

答案 3 :(得分:0)

我最终在我的实体中添加了一个count属性,只是在添加新关系时我就增加了它。使fetchedResultsController更容易使用。

如果您找到使用KVC的方法,请感兴趣。我从来不需要修复这个黑客。

这样的事情可能有用:

entity *match;    
match = (entity *)[objects objectAtIndex:0];
        NSSet *t = [match valueForKey:@"entity"]; 
        if(![t containsObject:newEntity]){
            int newCount = [match.count intValue] +1;
        [match addEntityObject:newEntity];
            [match setCount:[NSNumber numberWithInt:newCount]];