根据关系属性对获取请求进行排序
Posted
技术标签:
【中文标题】根据关系属性对获取请求进行排序【英文标题】:Sort fetch request based on relationship attribute 【发布时间】:2015-10-12 18:32:02 【问题描述】:假设我必须实体; Item
和 LocalizableString
。 LocalizableString
实体有两个属性; string
和 locale
。 Item
实体与LocalizableString
有一对多关系,称为localizedTitles
。每个“语言环境”都有一个字符串实体。
现在,在我的应用程序中,我有一些上下文/设置来确定在显示 UI 时我想使用什么 locale
。所以假设我有一个UITableViewController
和一个NSFetchedResultsController
处理数据流。
我的问题是:我可以根据LocalizableString
的string
属性对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)
【讨论】:
以上是关于根据关系属性对获取请求进行排序的主要内容,如果未能解决你的问题,请参考以下文章
根据一对多关系中的属性对 NSFetchRequest 进行排序?