Cocoa 获取核心数据实体,但不获取子实体
假设我将实体组织在一个层次结构中,Cocoa 获取核心数据实体,但不获取子实体,cocoa,core-data,Cocoa,Core Data,假设我将实体组织在一个层次结构中,Parent是根实体,Child是Parent的子类。我想设置一个NSArrayController,只获取Parent的实体,而不是Child 如果在Interface Builder中将阵列控制器的实体名称设置为Parent,它将获取所有Parent和Child实体。我最初尝试在Interface Builder中将阵列控制器的获取谓词设置为: entity.name == "Parent" 这对于XML存储是有效的,但当我切换到SQLite存储时,它就不
Parent
是根实体,Child
是Parent
的子类。我想设置一个NSArrayController
,只获取Parent
的实体,而不是Child
如果在Interface Builder中将阵列控制器的实体名称设置为Parent
,它将获取所有Parent
和Child
实体。我最初尝试在Interface Builder中将阵列控制器的获取谓词设置为:
entity.name == "Parent"
这对于XML存储是有效的,但当我切换到SQLite存储时,它就不再有效了。我得到以下错误:
keypath entity.name not found in entity <NSSQLEntity xxx>
keypath entity.name在实体中找不到
作为一种解决方法,我正在我的awakeFromNib
中设置一个筛选谓词(使用与上述相同的实体.name
谓词),以仅筛选父实体。显然,一旦实体在内存中,该谓词就有效,但不能在SQL支持的获取谓词中使用它
有没有一种方法可以使用与SQLite存储一起工作的fetch谓词只获取
父实体
而不获取子实体
实体?拉入只会在筛选谓词中忽略的实体似乎是浪费。Leopard将includesubentities
属性引入NSFetchRequest正是出于此目的。您必须对NSObjectController或NSArrayController进行子类化,以通过其defaultFetchRequest
属性提供它将使用的提取请求,或者通过覆盖其-fetchWithRequest:…
方法来更改它使用的提取请求。我尝试使用includesSubentities
,但它最终没有完全起作用。如果将“自动准备内容”设置为“是”,则对子实体的更改会导致阵列控制器的内容在不执行提取的情况下得到更新,从而绕过自定义提取谓词。回溯显示正在调用setContent:
以响应MOC通知
我发现唯一可靠的方法是使用过滤器谓词。除了上面Dave Dribin的答案之外。。。还要确保将ClearFilterPredicationInsertion设置为“否”,以便在插入或删除某些内容时不会立即清除过滤器(您可以在代码或IB中执行此操作)。