许多钥匙不允许在这里
我在两个实体之间有多对多的关系; A
和B
我想返回数组B.relationship
,每A
地方B.relationship
的计数大于0和排序B
的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'
我明白为什么我会遇到错误,但是我如何按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