2010-10-14 71 views
7

我想按实体对NSFetchRequest的结果进行分组。这些实体都共享相同的抽象父项。例如:是否可以在不添加额外属性的情况下按“NSFetchRequest”中的子类进行排序?

animal 
| 
|-cat 
| 
|-dog 

NSFetchRequestincludesSubentities设置TRUEentity设置为animal。可以将NSFetchedResultsController的sectionNameKeyPath设置为entity.name,但不可能对NSFetchRequestsortDescriptors做同样的处理,因为sortDescriptors应用于存储的属性(即数据库中的数据,而不是类中的方法)。因此按实体类型分组的唯一方法是向超类添加一个属性,子类可以用它来标识自己。

这看起来很疯狂,因为它破坏了继承的有用性。我查看了SQLite数据库,实体类型与属性存储在同一个表中,因此所需的数据已经就位。

总结:是否可以按NSFetchRequest中的子类进行排序而不添加其他属性?

+0

你有没有找到这个问题的答案? – epologee 2011-07-04 20:31:30

+0

@epologee。不,我没有找到解决方案。我认为最好的办法是重新排序'fetchedResultsController.sections'或不使用'NSFetchedResultsController'。 – 2011-07-04 20:34:00

+0

我已经采取了使用多个NSFetchedResultsController实例,每个实体一个:S。收藏这个问题,如果有人找到答案。干杯。 – epologee 2011-07-04 23:42:39

回答

2

我认为答案是否定的。

获取和排序发生在Store(对于SQLLite存储)中,所以属性需要成为数据模型的一部分。从核心数据编程指南(Persistent Store Features):

提取和商店类型之间有一些相互作用。在XML,二进制和内存存储中,谓词和排序描述符的评估在Objective-C中执行,可访问所有Cocoa的功能,包括NSString上的比较方法。另一方面,SQL存储将谓词和排序描述符编译为SQL,并在数据库本身中评估结果。这主要是为了性能,但这意味着评估发生在非Cocoa环境中,因此对依赖Cocoa的描述符(或谓词)进行排序无法工作。

此外,您无法排序使用SQLite的商店瞬态特性。

相关问题