2

私のドキュメント ベースの Cocoa アプリケーションは、ドキュメントのコア データ ストアにバインドされた NSOutlineView/NSTreeController コンボを使用します。私の NSTreeController には fetch predicate があり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.

xcdatamodel で属性を non-transientに変更すれば、この例外を回避し、新しく保存したドキュメントを正常に読み込むことができますisRootが、transient フラグに関する私の理解に基づいて問題が発生することはなく、これは実際には問題ではありません。永続化する必要があるデータの種類。

また、適切な固定値を返すように NSManagedObject サブクラスに実装しようと-isRootしただけでなく、 内で同じsetIsRoot:呼び出しを行ってみましたが、どちらも役に立ちawakeFromFetchませんでした。

私が見逃している他の微妙な点はありますか?フェッチ述語が一時属性をサポートしていないとは思えません。isRootCore Data の内部動作についてはよくわかりませんが、私の NSManagedObject サブクラスではなく、ストア固有のクラスを検索しようとしているのは興味深いようです。

4

3 に答える 3

6

フェッチ述語が一時的な属性をサポートしていないとは想像できません。

少し調べてみると、そうではないと言えます。このドキュメントを参照してください。引用:

一時プロパティに基づく述語を使用してフェッチすることはできません(ただし、一時プロパティを使用して自分でメモリをフィルタリングすることはできます)。

テストプロジェクトをまとめましたが、あなたとまったく同じエラーが発生することを確認できます。

ツリー内のルートノードを除外する必要がある場合parent == nilは、一時的な属性の代わりにフェッチ述語を使用します。

私はあなたの反応を理解しています-私もisRootと呼ばれる属性を持つ方法が欲しかったのです。私の推測ではそれは可能ですが、それは非常に多くのコードを必要とするので、面倒な価値はありません。

ああ、コアデータを少しでも扱っているのなら、mogeneratorはあなたの生活をずっと楽にしてくれるでしょう。

于 2010-08-31T21:47:55.663 に答える
1

もう 1 つのオプションは、最上位ノードに別のクラスを用意し、そのクラス名を「エンティティ名」として使用し、「フェッチ述語」を空白のままにすることです。子ノードが最上位ノードと同じ値を持っている限り (私は共通のスーパークラス/エンティティ継承を使用しています)、すべてが機能します。

于 2011-12-25T05:27:51.823 に答える
0

NSTreeController がクラスではなくエンティティを制御するように設定されていることを確認しましたか?

エラーから、デフォルトの NSMutableDictionary のクラスに設定されている可能性があるようです。

ツリー コントローラー属性のスクリーンショット

また、おそらく isRoot を永続化できると主張したいと思います。もちろん、アプリで何をしようとしているかによって異なりますが、アプリの実行時に読み込まれるツリー ビューの場合は、isRoot を永続化します。

于 2010-08-31T18:12:06.423 に答える