NSTreeController基于瞬态isRoot异常获取谓词

时间:2010-08-31 04:04:42

标签: cocoa core-data nstreecontroller

我的基于文档的Cocoa应用程序使用绑定到文档的Core Data存储的NSOutlineView / NSTreeController组合。我的NSTreeController具有fetch谓词isRoot == YESisRoot是一个临时布尔属性,默认值为NO。我的根模型awakeFromInsert调用:

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

我能够很好地将对象添加到层次结构中,但是当我尝试加载我刚刚保存的文档时,我得到了一个例外:

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

如果我在xcdatamodel中将isRoot属性更改为非瞬态,我可以解决此异常并成功加载新保存的文档,但基于我对瞬态标志的理解,它不会导致问题,这实际上不是那种应该持久化的数据。

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

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

3 个答案:

答案 0 :(得分:6)

  

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

经过一番研究,我可以告诉你,他们没有。 See this document.引用:

  

您无法使用谓词进行提取   基于瞬态属性   (虽然你可以使用瞬态   要在内存中过滤的属性   自己)。

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

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

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

哦,如果你处理核心数据的时间不多,mogenerator会让你的生活更轻松。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

Tree Controller attribute screenshot

我也认为也许isRoot可以坚持下去。当然,这取决于你正在尝试用你的应用程序做什么,但如果它是在应用程序运行时加载的树视图,我要么使isRoot保持不变。