4

假设我有以层次结构组织的实体,它们Parent是根实体并ChildParent. 我想设置一个NSArrayController来仅获取 的实体Parent,但不获取Child

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

entity.name == "Parent"

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

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

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

有没有办法只获取Parent实体,而不是Child使用与 SQLite 存储一起使用的获取谓词的实体?使用过滤谓词引入您只会忽略的实体似乎很浪费。

4

2 回答 2

7

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

于 2008-11-18T08:10:24.170 回答
4

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

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

于 2008-11-20T02:59:24.933 回答