假设我在层次结构中组织了实体,其中 Parent
是根实体, Child
是 Parent
的子类 . 我想设置一个 NSArrayController
来仅获取 Parent
的实体,而不是 Child
.
如果将Interface Builder中的数组控制器的实体名称设置为 Parent
,则它将获取所有 Parent
和 Child
实体 . 我最初尝试在Interface Builder中将数组控制器的fetch谓词设置为:
entity.name == "Parent"
这适用于XML存储,但是当我切换到SQLite存储时,它不再起作用 . 我收到以下错误:
keypath entity.name not found in entity <NSSQLEntity xxx>
作为解决方法,我在我的 awakeFromNib
中设置过滤谓词(具有与上面相同的 entity.name
谓词)以仅过滤父实体 . 显然,一旦实体在内存中,该谓词就有效,但您不能在SQL支持的提取谓词中使用它 .
有没有办法只使用与SQLite存储一起使用的fetch谓词来获取 Parent
实体,而不是 Child
实体?使用过滤谓词来提取您只会忽略的实体似乎很浪费 .
2 回答
为了这个目的,Leopard向NSFetchRequest引入了
includesSubentities
属性 . 您必须子类化NSObjectController或NSArrayController以提供它将通过其defaultFetchRequest
属性使用的获取请求,或者通过覆盖其-fetchWithRequest:...
方法来更改它使用的获取请求 .我尝试使用
includesSubentities
,但最终没有完全正常工作 . 事实证明,如果您将"automatically prepares content"设置为"Yes",则子节点的更改会导致阵列控制器的内容在不进行提取的情况下进行更新,从而绕过自定义提取谓词 . 回溯显示为响应MOC通知而调用setContent:
.我发现可靠地执行此操作的唯一方法是使用过滤谓词 .