使用NSSortDescriptor通过多对多关系获取CoreData

时间:2013-12-11 22:33:14

标签: ios objective-c core-data

我有2个CoreData实体(Person,Pet),它们具有以下关系:

一个人可以有多个宠物。因此,Person-> Pet。存在To-Many关系。

我想取所有人,按宠物的数量排序,其中宠物最多的人是第一个,宠物最少的人是最后一个。

在获取人员列表时,我尝试使用如下的NSSortDescriptor:

[NSSortDescriptor sortDescriptorWithKey:@"pets.count" ascending:NO]

我认为“person”上的“pets”属性允许我使用NSSet的count属性进行排序。唉,CoreData抱怨这个错误:

Fetch exception to-many key not allowed here

这是一种完全错误的做法吗?我怎么能用CoreData fetch做这样的事情?

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:12)

尝试使用collection operators

[NSSortDescriptor sortDescriptorWithKey:@"pets.@count" ascending:NO]

这不能直接应用(对于获取请求),您需要执行fetch,然后对结果数组(sortedArrayUsingDescriptors:)运行排序。

如果要在获取时进行排序,则需要向保存计数的实体添加(非瞬态)属性。

答案 1 :(得分:1)

看一下这个答案https://stackoverflow.com/a/20317087/2567126

基本上,您在NSManagedObject上创建持久属性,并在从关系中添加或删除子对象时更新属性计数。

答案 2 :(得分:0)

将密钥格式更改为@"pets.@count"

答案 3 :(得分:0)

除了Swift,我还需要做同样的事情。我只是遵循:

  1. 从CoreData获取请求,但不包含“ count”键值。
  2. 我对获取的结果进行了排序(高阶函数)。
allCategory.sort { (category1, category2) -> Bool in
            return category1.tasks?.count > category2.tasks?.count
        }

这对我有用。