4

ParentルートエンティティでありChild、のサブクラスである階層に編成されたエンティティがあるとしParentます。NSArrayControllerのエンティティのみを取得するように を設定したいのですが、 は取得しParentませんChild

Interface Builder でアレイ コントローラのエンティティ名を に設定するとParent、すべてParentChildエンティティが取得されます。最初に、Interface Builder で配列コントローラーのフェッチ述語を次のように設定しようとしました。

entity.name == "Parent"

これは XML ストアでは機能しましたが、SQLite ストアに切り替えると機能しなくなりました。次のエラーが表示されます。

keypath entity.name not found in entity <NSSQLEntity xxx>

回避策として、親エンティティのみをフィルター処理するためにフィルター述語 (entity.name上記と同じ述語を使用) を設定しています。awakeFromNibどうやら、エンティティがメモリ内にあると、その述語は有効になりますが、SQL を使用したフェッチ述語では使用できません。

SQLiteストアで動作するフェッチ述語を使用して、エンティティParentのみをフェッチする方法はありますか? Childフィルタ述語で無視するだけのエンティティを取り込むのは無駄に思えます。

4

2 に答える 2

7

Leopardは、includesSubentitiesまさにこの目的のためにNSFetchRequestにプロパティを導入しました。NSObjectControllerまたはNSArrayControllerをサブクラス化して、defaultFetchRequestプロパティを介して使用するフェッチリクエストを提供するか、-fetchWithRequest:...メソッドをオーバーライドして使用するフェッチリクエストを変更する必要があります。

于 2008-11-18T08:10:24.170 に答える
4

を使用してみincludesSubentitiesましたが、完全に機能しませんでした。サブエンティティを変更すると、「コンテンツを自動的に準備する」を「はい」に設定している場合、フェッチを実行せずにアレイコントローラーのコンテンツが更新され、カスタムフェッチ述語がバイパスされることが判明しました。setContent:バックトレースは、MOC 通知に応答して呼び出されたことを示しています。

これを確実に行う唯一の方法は、フィルター述語を使用することです。

于 2008-11-20T02:59:24.933 に答える