NSPredicate 返回子查询的数组

Posted

技术标签:

【中文标题】NSPredicate 返回子查询的数组【英文标题】:NSPredicate return subquerie'd array 【发布时间】:2018-07-13 20:54:57 【问题描述】:

我的模特:

我只想获得一组带有城市的国家,其名称包含单词的给定部分。

我试过了:

let request : NSFetchRequest<Country> = Country.fetchRequest()
request.predicate = NSPredicate(format: "SUBQUERY(cities, $city, $city.name CONTAINS[cd] %@).@count > 0", givenWordPart)
let countries: [Country] = try! context.fetch(request)

但它会返回包含所有城市的国家/地区数组。

【问题讨论】:

也许题外话,但你也应该在城市和国家之间建立相反的关系,一对一的关系。 【参考方案1】:

我认为您需要将结果收集到两个单独的集合中。使用与上述相同的谓词创建对 City 的获取请求,但作为普通查询而不是子查询。

这将返回与您的搜索条件匹配的城市实例数组,以获取您可以从城市数组中提取它们的国家/地区的选择

//fetch and predicate declaration...
let cities: [City] = try! context.fetch(request)
let countries = Set<Country>(cities.map($0.country ))

这假设您已经定义了从城市到国家的逆一对一关系

【讨论】:

国家会有一大堆重复的 + 速度慢 像我一样添加到集合时没有重复。与您的子查询相比,为什么这会这么慢?【参考方案2】:

这是预期的行为。它查询Countries 并返回与谓词匹配的那些。返回的Countries 仍然包含所有城市,如果您只想要具有特定规则的城市,则必须为每个Country 收集cities

【讨论】:

以上是关于NSPredicate 返回子查询的数组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NSPredicate 捕获子对象?

NSPredicate:与日期iOS的to-Many关系

过滤巨大的 NSArray

NSPredicate 使用 OR 错误

子查询中的 NSPredicate

CoreData:NSPredicate 按日期过滤