许多钥匙不允许在这里

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

我想返回数组B.relationship ,每A地方B.relationship的计数大于0和排序BdateCreated财产。

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

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'

我明白为什么我会遇到错误,但是我如何按Core Data中的排序描述符对多个属性进行排序?

编辑

为了更清楚一点,我想获取最新的6个Activity实体,它们按照它们的dateCreated属性排序(最新的第一个)。

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


你不能根据一对多关系的属性进行排序,因为这没有意义。 CoreData需要决定首先放置哪个变体。 您的排序描述符说“使用相关活动的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])
}
链接地址: http://www.djcxy.com/p/36153.html

上一篇: many key not allowed here

下一篇: Sort fetch request based on relationship attribute