假设我在层次结构中组织了实体,其中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>
作为解决方法,我在我的entity.name
中设置过滤谓词(具有与上面相同的awakeFromNib
谓词)以仅过滤父实体。显然,一旦实体在内存中,该谓词就有效,但您不能在SQL支持的提取谓词中使用它。
有没有办法只使用适用于SQLite存储的fetch谓词来获取Parent
个实体,而不是Child
个实体?使用过滤谓词来提取您只会忽略的实体似乎很浪费。
答案 0 :(得分:7)
Leopard为此目的向NSFetchRequest引入了includesSubentities
属性。您必须子类化NSObjectController或NSArrayController以提供它将通过其defaultFetchRequest
属性使用的获取请求,或者通过覆盖其-fetchWithRequest:...
方法来更改它所使用的获取请求。
答案 1 :(得分:3)
我尝试使用includesSubentities
,但最终没有完全正常工作。事实证明,如果您将“自动准备内容”设置为“是”,则子节点的更改会导致阵列控制器的内容在不进行提取的情况下进行更新,从而绕过自定义提取谓词。回溯显示为响应MOC通知而调用setContent:
。
我发现可靠的唯一方法是使用过滤谓词。