获取核心数据实体,但不获取子实体

Posted

技术标签:

【中文标题】获取核心数据实体,但不获取子实体【英文标题】:Fetching Core Data entities, but not sub-entities 【发布时间】:2008-11-18 06:41:38 【问题描述】:

假设我有一个层次结构的实体,Parent 是根实体,ChildParent 的子类。我想设置一个NSArrayController 来只获取Parent 的实体,而不是Child

如果您在 Interface Builder 中将数组控制器的实体名称设置为 Parent,它将获取所有 ParentChild 实体。我最初尝试在 Interface Builder 中将数组控制器的 fetch 谓词设置为:

entity.name == "Parent"

这适用于 XML 存储,但是当我切换到 SQLite 存储时,它不再有效。我收到以下错误:

keypath entity.name not found in entity <NSSQLEntity xxx>

作为一种解决方法,我在awakeFromNib 中设置了一个过滤谓词(与上面的entity.name 谓词相同)以仅过滤父实体。显然,一旦实体在内存中,该谓词就有效,但您不能在 SQL 支持的提取谓词中使用它。

有没有办法使用适用于 SQLite 存储的获取谓词仅获取 Parent 实体,而不获取 Child 实体?使用过滤谓词提取您只会忽略的实体似乎很浪费。

【问题讨论】:

【参考方案1】:

Leopard 正是为此目的向 NSFetchRequest 引入了includesSubentities 属性。您必须继承您的 NSObjectController 或 NSArrayController 以通过其defaultFetchRequest 属性提供它将使用的获取请求,或者通过覆盖其-fetchWithRequest:... 方法来更改它使用的获取请求。

【讨论】:

【参考方案2】:

我尝试使用includesSubentities,但最终无法完全正常工作。事实证明,如果您将“自动准备内容”设置为“是”,那么对子实体的更改会导致数组控制器的内容在不进行获取的情况下更新,从而绕过自定义获取谓词。回溯显示 setContent: 被调用以响应 MOC 通知。

我发现可靠地做到这一点的唯一方法是使用过滤谓词。

【讨论】:

除了上面 Dave Dribin 的回答...还要确保将 clearsFilterPredicateOnInsertion 设置为 NO 以便在插入或删除某些内容时不会立即清除过滤器(您可以这样做在代码或 IB 中)。

以上是关于获取核心数据实体,但不获取子实体的主要内容,如果未能解决你的问题,请参考以下文章

如何从核心数据中获取父实体的所有子实体,以及如何将父数据用作 UITableview

使用基于属性的过滤子元素集获取核心数据实体

使用魔法记录从核心数据中获取关系实体

获取核心数据中一对多关系的计数

获取“最新”单个实体的最简单 Fetch 请求 - 核心数据

核心数据从父级获取 GrandChild