2008-11-18 168 views
4

假设我有一个层次结构的实体,Parent是根实体,ChildParent的子类。我想设置一个NSArrayController以仅提取Parent的实体,但不提取Child提取核心数据实体,但不提取子实体

如果您将Interface Builder中的阵列控制器的实体名称设置为Parent,则它将获取所有ParentChild实体。我本来试图在Interface Builder设置阵列控制器的获取谓语:

entity.name == "Parent" 

这个工作对一个XML存储,但是当我切换到一个SQLite存储,它不再工作。我得到以下错误:

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

由于周围的工作,我在我的awakeFromNib建立一个过滤谓词(与上述相同entity.name谓语)仅过滤父实体。显然,谓词在实体处于内存中时是有效的,但不能在SQL支持的谓词谓词中使用它。

有没有办法只提取Parent实体,但不是Child实体使用与SQLite存储一起使用的提取谓词?使用过滤器谓词来拉入实体时,看起来很浪费。

回答

3

我尝试使用includesSubentities,但它最终没有完全工作。原来,如果您将“自动准备内容”设置为“是”,从而绕过自定义提取谓词,则子实例的更改会导致数组控制器的内容在未执行提取的情况下得到更新。回溯显示setContent:被响应于MOC通知而被调用。

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

+0

除了上面Dave Dribin的回答之外,还要确保将clearsFilterPredicateOnInsertion设置为NO,以便在您插入或删除某些内容时您的过滤器不会被清除(您可以在代码或IB中执行此操作) 。 – StevenO 2014-02-28 15:59:38

7

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