2

我的基于文档的 Cocoa 应用程序使用 NSOutlineView/NSTreeController 组合,绑定到文档的核心数据存储。我的 NSTreeController 有 fetch predicate isRoot == YESisRoot是一个瞬态布尔属性,默认值为NO. 我的根模型的awakeFromInsert调用:

[self setIsRoot:[NSNumber numberWithBool:YES]];

我可以很好地将对象添加到层次结构中,但是当我尝试加载刚刚保存的文档时,出现异常:

[<NSDictionaryMapNode 0x1001a8190> valueForUndefinedKey:]: this class is not key value coding-compliant for the key isRoot.

isRoot如果我在 xcdatamodel 中将属性更改为非瞬态,我可以解决此异常并成功加载新保存的文档,但根据我对瞬态标志的理解,它不应该引起问题,这真的不是应该持久化的数据类型。

我还尝试-isRoot在 NSManagedObject 子类中实现以返回适当的固定值,以及在setIsRoot:内进行相同的调用awakeFromFetch,但均无济于事。

我还缺少其他一些微妙之处吗?我无法想象 fetch 谓词不支持瞬态属性。我对 Core Data 的内部工作了解不多,但它试图查找isRoot特定于商店的类而不是我的 NSManagedObject 子类似乎很有趣。

4

3 回答 3

6

我无法想象 fetch 谓词不支持瞬态属性。

经过一番研究,我可以告诉你,他们没有。请参阅此文档。引用:

您不能使用基于瞬态属性的谓词进行获取(尽管您可以使用瞬态属性自己在内存中进行过滤)。

我已经整理了一个测试项目,并且可以验证我得到的错误与您完全相同。

当我需要过滤掉树中的根节点时,我使用提取谓词parent == nil而不是瞬态属性。

我理解你的反应——我也想拥有一个专门称为 isRoot 的属性。我的猜测是这是可能的,但它需要这么多代码,这不值得麻烦。

哦,如果您处理的核心数据不止一点点,mogenerator将使您的生活更轻松。

于 2010-08-31T21:47:55.663 回答
1

另一种选择是为顶级节点设置一个单独的类,将该类名称用作“实体名称”并将“获取谓词”留空。只要子节点与顶级节点具有相同的值(我使用通用的超类/实体继承),一切仍然有效。

于 2011-12-25T05:27:51.823 回答
0

您是否确定将 NSTreeController 设置为控制实体而不是类?

从您的错误来看,它看起来可能被设置为具有默认值的类 - NSMutableDictionary。

树控制器属性截图

我还认为 isRoot 可能会被保留。当然,这取决于您尝试对您的应用程序做什么,但如果它是在应用程序运行时加载的树视图,我要么让 isRoot 持久化。

于 2010-08-31T18:12:06.423 回答