这里不允许使用NSFetchRequest to-many键

时间:2016-06-25 17:49:01

标签: core-data nspredicate nsfetchrequest nssortdescriptor

我有两个实体之间的多对多关系; AB

我希望为B.relationship的{​​{1}}数量大于0的A返回一个B.relationship数组,并按B的{​​{1}}排序属性。

这是我目前的代码,可能更有意义。

dateCreated

当我运行请求时,我得到以下异常:

let fetchRecentVariationsRequest = NSFetchRequest(entityName: "Variation") fetchRecentVariationsRequest.predicate = NSPredicate(format: "ANY activities.@count > 0") fetchRecentVariationsRequest.sortDescriptors = [NSSortDescriptor(key: "activities.dateCreated", ascending: true)]

我理解为什么我会收到错误,但是我如何按核心数据中的排序描述符排序多个属性?

修改

为了更清楚,我想获取按*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here’属性排序的最近的Activity个实体(最新的第一个)。

然后,我想通过dateCreated实体的Variation关系获取与这些已获取的Activity实体相关的所有Activity个实体。

1 个答案:

答案 0 :(得分:0)

您无法按多对多关系的属性进行排序,因为它没有任何意义。 CoreData需要决定首先放置哪个Variation。您的排序描述符表示“在相关活动上使用dateCreated的值”。但是有几个活动,每个变体有几个不同的dateCreated值。应该使用哪些活动'dateCreated?最后?首先?平均值?

但除了概念问题之外,CoreData只允许您使用属性或一对一关系进行排序(至少对于从SQLite存储中获取)。没有瞬态特性;没有计算属性。因此,如果要使用最近相关活动的dateCreated,则需要向Variation添加一个属性,每次将活动添加到关系时,都会更新该属性。

修改

鉴于您的更新,我将首先获取最近的六个活动:

fetchRecentActivitiesRequest = NSFetchRequest(entityName: "Activity")
fetchRecentActivitiesRequest.sortDescriptors = [NSSortDescriptor(key: "dateCreated", ascending: false)]
fetchRecentActivitiesRequest.fetchLimit = 6
// I recommend using the next line to fetch the related Variations in one go
fetchRecentActivitiesRequest.relationshipKeyPathsForPrefetching = ["variations"]
let recentActivities = try! context.executeFetchRequest(fetchRecentActivitiesRequest) as! [Activity]

然后使用variations关系获取相应的Variations

let nameSort = NSSortDescriptor(key: "name", ascending: true)
let recentVariations = recentActivities.flatMap() {
    $0.variations!.sortedArrayUsingDescriptors([nameSort])
}