根据关系属性对获取请求进行排序

Posted

技术标签:

【中文标题】根据关系属性对获取请求进行排序【英文标题】:Sort fetch request based on relationship attribute 【发布时间】:2015-10-12 18:32:02 【问题描述】:

假设我必须实体; ItemLocalizableStringLocalizableString 实体有两个属性; stringlocaleItem 实体与LocalizableString 有一对多关系,称为localizedTitles。每个“语言环境”都有一个字符串实体。

现在,在我的应用程序中,我有一些上下文/设置来确定在显示 UI 时我想使用什么 locale。所以假设我有一个UITableViewController 和一个NSFetchedResultsController 处理数据流。

我的问题是:我可以根据LocalizableStringstring 属性对Item 实体进行排序,其中locale 是例如en?我可以在 获取请求 中执行此操作,而不是在获取所有项目之后吗?

【问题讨论】:

【参考方案1】:

当然可以,但您不必预先获取任何特定的语言环境。您的获取结果控制器只会获取Item 对象,然后您可以根据需要引用正确的字符串。

实现这一点的一种方法是向Item 类添加一个便利函数,如下所示

func titleWithLocale(identifier: String) -> String? 
   if let title = self.localizedTitles.filter 
          $0.locale == identifier 
         .first as? LocalizableString 
     return title.string
   
   return nil

您很可能必须调整此代码以符合 Swift 的严格类型,但您明白了。

如果您需要按标题字符串排序,也许您需要一种不同的方法。如果您知道每个 Item 在各自的语言环境中都有一个本地化标题,您可以使用该语言环境的过滤器的谓词来获取 LocalizedTitle 实体:

 request.predicate = NSPredicate(format: "locale = %@", "en")

显然,您可以使用通常的排序描述符按string 进行排序。现在,要填充您的表格,您可以按照另一个方向的关系找到该项目。

 let title = fetchedResultsController.objectAtIndexPath(indexPath)!
 let item = title.item

【讨论】:

也许我的问题不清楚。但我需要能够对 LocalizableString 进行 排序 好的,我已经扩展了我的答案。 这实际上是我刚刚做的!我的主要获取请求是针对LocalizableString 实体,其中我的Item 的标题的反向关系不为零。我要更新我的问题! 所以你应该接受这个答案。您可以在 fetched results 控制器中使用此 fetch 请求。如果它们为 nil,即不存在,则查询将不会返回和标题。【参考方案2】:

我最终改为为我的LocalizableString 实体执行获取请求。使用检查 locale 和反向关系的谓词:

NSPredicate(format: "locale == %@ AND itemName != nil", locale)

【讨论】:

以上是关于根据关系属性对获取请求进行排序的主要内容,如果未能解决你的问题,请参考以下文章

对核心数据请求进行升序排序

如何根据来自多个 Core Data 属性的计算值进行排序

js怎么实现根据后台回传的数据对商品进行排序?

根据一对多关系中的属性对 NSFetchRequest 进行排序?

NSSortDescriptor 按核心数据对多关系中的项目数排序

关系属性的核心数据获取请求