【问题标题】:Core Data: sorting by count in a to-many relationship核心数据:在一对多关系中按计数排序
【发布时间】:2011-04-23 08:49:59
【问题描述】:

我目前正在尝试设置一个 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'。

对可能出现的问题有任何想法吗?

【问题讨论】:

  • 您可能希望使用arrayWithObject: 而不是allocinitWithObjects:。除其他原因外,不释放数组不会导致泄漏。
  • 这只是我想要完成的伪代码,我将在我的实际代码中释放数组。

标签: iphone cocoa core-data nsfetchedresultscontroller


【解决方案1】:

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

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

这样的东西可能有用:

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]];

【讨论】:

  • 在我看来,这一定是一个更好、更优雅的解决方案。有人知道吗?谢谢。
【解决方案2】:

据我所知,您无法在查询中应用 @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];

【讨论】:

    【解决方案3】:

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

    所以在这种特殊情况下,将属性countOfChildren 添加到Parent 实体。这应该会删除异常。

    编辑:此修复似乎仅适用于 iOS 6.1,不适用于 iOS 6.0。

    【讨论】:

    • 嘿,你能提供更多细节吗?作者应该在模型中添加了countOfChildren属性吧?它是什么类型的属性?此设置还有更多内容吗?
    【解决方案4】:

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

    【讨论】:

    • 我如何使用派生属性。我也想通过对多关系孩子的计数对父母进行排序。请给我一些示例代码,谢谢。
    • 到目前为止,这是最好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    相关资源
    最近更新 更多