我有两个实体之间的多对多关系; A
和B
。
我希望为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
个实体。
答案 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])
}