【问题标题】:NSSortDescriptor and to-many relationshipsNSSortDescriptor 和多对多关系
【发布时间】:2009-10-05 14:44:31
【问题描述】:

我有两种反对意见:地点和历史项目。 我正在尝试获取附加到任何历史记录项的位置,因此我对该位置的获取谓词是“history.@count > 0”,它工作正常。

我还想使用 NSSortDescriptor 按其最新历史项目的日期对位置对象进行排序,据我所知,这将是“history.@max.time”,但这会引发以下错误:

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序, 原因:'包含 KVC 聚合的 Keypath 不应该有; 未能处理历史。@max.time'

Halp plox?

【问题讨论】:

  • location.history 是一个数组/集合吗? (似乎是一个,但你有一个单数形式。)
  • 这是一个对多的关系,这意味着它是。单数形式是我的错,但我现在不想弄乱它以避免破坏任何东西。
  • Joonas,你发现了吗?我处于完全相同的情况,并得到同样的错误。谢谢
  • 恐怕我没有,因为我有更紧迫的问题要处理,所以目前列表仍然按照 Core Data 想要表示的方式排序。不过,如果能得到解决方案,那就太好了。
  • 我完全忘记了留下上述评论,并且“不知何故”设法让@“articles.@max.postDate”工作。我跑回这篇文章寻找类似问题的答案。在我尝试使用的另一段代码中:@“@max.unreadArticles”并收到错误:实体搜索不符合键“@max”的键值编码我将发布我可以看到的内容“可能”的事情可能已经解决了,在下面的答案中。

标签: iphone cocoa-touch core-data


【解决方案1】:

AFAIK,您只能使用Key-Value Coding Programming Guide 中描述的collection operators,作为您的排序描述符的关键路径,使用collectionsNSArrayNSSetNSDictionary)。

您不得将集合运算符用于带有提取请求 (NSFetchRequest) 的排序描述符的键路径。

@kdbdallas 正确使用集合运算符对NSArray 进行排序。他没有使用它来指定获取请求的排序描述符。

如果集合运算符能够指定用于对获取请求进行排序的关键路径,那就太好了。请在http://bugreport.apple.com/ 提交此功能请求。报道得越多,他们就越有可能支持它。

【讨论】:

  • 我向 Apple 提交了此问题:ID:9758650,标题:Collection Operators should work with Core Data,产品:iPhone SDK,分类:增强,发起日期:2011 年 7 月 12 日上午 12:26 , 状态:打开
  • 我提交了具有相同标题的 rdar://10468062 以及 Departments 和 Employees 的示例。推荐的人越多越好!
  • 在开放式雷达上找不到错误报告 10468062。这真的很有帮助,所以我可以更容易地欺骗它。
【解决方案2】:

可能不是最好的解决方案,但您可以随时拉回数据并在事后对其进行排序。看看Sorting and Filtering NSArray Objects

【讨论】:

    【解决方案3】:

    从 iOS 13(和朋友)开始,您应该能够使用派生表达式 max:(history.time) 创建一个名为 historyMaxTimederived attribute,然后设置 fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"historyMaxTime" ascending:NO]]

    【讨论】:

      【解决方案4】:

      这是我做类似的一些代码

      NSError *error;
      
      if (![[self fetchedResultsController] performFetch:&error])
      {
          UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];
          [alert show];
      }
      else
      {
          self.feedsArray = [fetchedResultsController fetchedObjects];
      
          NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"articles.@max.postDate" ascending:NO];
          NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
      
          self.feedsArray = [feedsArray sortedArrayUsingDescriptors:sortDescriptors];
      
          [sortDescriptors release];
          [sortDescriptor release];
      
          NSInteger overviewAmount = [[feedsArray valueForKeyPath:@"@sum.unreadArticles"] integerValue];
      
          ....
      }
      

      【讨论】:

      • 知道什么可以解决它吗?在该代码中看不到任何可以修复的内容...
      • 我不确定...你有你的实体子类化吗?我的两个都是(所以在上面的示例中,我正在获取的实体和文章实体被子类化)我在文章的子类中没有任何特别之处,所以我真的不记得为什么我将它子类化,所以也许这就是为什么...另一个想法是在我的文章实体中我在要索引的模态中设置@max 的属性 postDate。也许尝试一下。还要确保您的日期值具有默认值。我使用:1980-01-01 00:00:01
      猜你喜欢
      • 2015-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 2021-10-18
      • 2010-09-12
      相关资源
      最近更新 更多