核心数据:根据实体类型对抽象实体的结果进行排序

Posted

技术标签:

【中文标题】核心数据:根据实体类型对抽象实体的结果进行排序【英文标题】:Core Data: Sorting results from an abstract entity based on entity type 【发布时间】:2011-09-22 14:32:26 【问题描述】:

是否可以根据实体类型对Core Data的结果进行排序,但是:

无需添加名为entityType 之类的虚假属性,并且 不会通过使用 KVO/KVC 技巧(例如引入 -(NSString*)typeOfEntity 或类似方法)对性能产生不利影响?

我目前有:

TradeDocument 作为抽象实体,带有 QuoteTradeDocumentInvoiceTradeDocument 作为基于它的实体。

我想显示实体类型和/或允许基于此对 NSTableView 进行排序。

我在 OS X 上使用 Cocoa 绑定。


注意:我明确地试图避免每个对象出错。

【问题讨论】:

【参考方案1】:

伊万,

抽象实体的唯一限制是您不能实例化一个。您仍然可以获取它们。然后,测试每个托管对象是哪个子类是一件相当简单的事情。

按类型排序不是排序描述符可以做的事情,而是一个函数可以做的事情,就像-sortUsingFunction:context:一样。

安德鲁

【讨论】:

然而,这意味着每个对象都会出错。我试图避免这种情况。由于 Core Data 必须在 SQLite 中存储对象类型,我非常想知道是否有一种公开的方式可以将其用作排序标准。 Ivan,您可以读入对象而不会出错或填充行缓存。请参阅 NSFetchRequest 上的 -includesPropertyValues。您将能够使用 -isKindOfClass: 内省对象的种类,而不会触发错误。换句话说,我上面的答案仍然可以正常工作。如果您希望排序发生在 SQLite 中,那么我认为您不走运。安德鲁 谢谢。很遗憾,Apple 没有想到这种排序并将其应用到 SQLite 中。我可能不得不将获取请求放入代码中的 NSArrayController 中,对吧?您的解决方案似乎不错,但我会看看其他人是否提供了更优化的解决方案,一种可以在持久存储中使用某种现有的、索引的数据结构的解决方案。如果没有人来,我会接受你的回答。 Ivan,Core Data 与 ORM 不同。正如他们所说,它是一个对象图管理器。 SQLite 只是几种持久性机制之一。 我完全清楚这一点。但是,如果 SQLite 后端可以为恢复部分对象图提供可能的优化,那么使用它会很有趣。

以上是关于核心数据:根据实体类型对抽象实体的结果进行排序的主要内容,如果未能解决你的问题,请参考以下文章

核心数据。无法根据与继承实体的关系来获取/排序实体

对核心数据中的相关实体进行排序

按两个依赖属性对核心数据实体进行排序

抽象实体的核心数据通用属性类型

如何对两个不同的核心数据对象进行排序?

根据实体类对 NSFetchRequest 进行排序