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

Ada*_*ble 2 cocoa core-data nstreecontroller

我的基于文档的Cocoa应用程序使用绑定到文档的Core Data存储的NSOutlineView/NSTreeController组合.我的NSTreeController有fetch谓词isRoot == YES. isRoot是一个临时布尔属性,默认值为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子类.

Joh*_*her 6

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

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

您无法使用基于瞬态属性的谓词进行提取(尽管您可以使用瞬态属性自行在内存中进行过滤).

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

当我需要过滤树中的根节点时,我使用fetch谓词parent == nil而不是transient属性.

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

哦,如果你只是处理核心数据,mogenerator会让你的生活更轻松.