1

私はこのようなコアデータ関係を持っています

アイテムA ->> アイテムB

itemAには多くのitemBがあります。「2」に設定されたint32ステータスプロパティを持つitemAに関連付けられたitemBに関連付けられたすべてを取得できるフェッチされたプロパティを使用したかったのです。そこで、データモデラーでフェッチされたプロパティを作成しました。これには次のものがあります。

取得したプロパティ: completedItem 述語: status == 2 宛先: itemB

最初に試してみたとき、アイテムが戻ってきて、それはすべてクールで完了したと思いましたが、後で奇妙な動作に気付き、返されたアイテムをよく見ると、関連するアイテムBの実際の量を処理するものは何もありませんでしたitemA オブジェクト。さらに奇妙なのは、戻り値の型が NSFaultingMutableArray であることです。ここに簡単な例があります

  • アイテムAにはアイテムBが0個あります
  • ItemA が ItemB の NSSet プロパティでフィルター処理された述語検索を実行すると、0 が返されます。
  • フェッチされたプロパティ「completedItem」は ItemB の 4 を返します
  • 返される型は NSFaultingMutableArray です

これは今の私の頭の中で奇妙で、本当に意味がありません。何か案は?

更新 1:

ここにリストされているフェッチされたプロパティは、問題の ItemA に関連付けられていなくても、述語に一致するコア データが提供する必要があるすべてのItemB オブジェクトを取得するようです。

4

3 に答える 3

3

この問題のすべての奇妙さに対する答えは次のとおりです。

1) フェッチされたプロパティは実際、ItemA のためだけに ItemB オブジェクトを返していませんでした。これを行うには、フェッチされたプロパティの述語に次のようなものを追加する必要があります

status == 2 AND ItemA == $FETCH_SOURCE

2) フェッチされたプロパティのドキュメントから:

フェッチされたプロパティは遅延評価され、その後キャッシュされます。

宛先エンティティのオブジェクトが変更された場合は、フェッチされたプロパティを再評価して最新であることを確認する必要があります。プロパティを手動で更新するには、refreshObject:mergeChanges: を使用します。これにより、次にオブジェクトの障害が発生したときに、このプロパティに関連付けられたフェッチ リクエストが再度実行されます。

そのため、基本的にrefreshObject:mergeChangesを使用してオブジェクトを手動で更新し、取得したプロパティを再読み込みします。これを行うには、refresh メソッドを追加するか、サブクラス化された NSManagedObject 内の KVC get メソッドに派手なオーバーライドを行います。

そうは言っても、ここにいる他の人 (Rob Booth、Grady Player) は、フェッチされたプロパティを完全にバイパスすることによって、他の有効な解決策を持っています。これらはファリルですが

于 2011-12-14T04:48:57.463 に答える
0

カイル、問題は、コア データがあなたより賢くなろうとしているところです。Core Data は、使用しない場合、データストア内のすべてのオブジェクトでメモリをいっぱいにしたくありません。そのため、常に実際のオブジェクトを作成する代わりに、「障害」を作成します。障害は実際のオブジェクトのプレースホルダーであり、それらのオブジェクトを要求すると、その時点で Core Data が移動してオブジェクトに入力されます。

私の最善の推測は、 ItemA.ItemB プロパティでの検索がリンクされたオブジェクトを認識していないため、0 セットが返されているということです。NSSet *mySet = ItemA.ItemB を実行した場合、mySet に正しい数のオブジェクトが含まれていることがわかるはずです。ただし、ItemA.ItemB でカウントを実行すると、カウント メッセージが Faulted Set に送信されるため、0 が返されます。

completedItems プロパティを使用すると、CoreData は少なくとも正しい数のオブジェクトを返すために何らかの処理を行っているように見えますが、実際のオブジェクト データはまだ返されていません。

于 2011-12-13T22:35:31.987 に答える
0

この用語を使用しましょう:

ClassA の objectA が 1 つあります。

ClassB のオブジェクト (名前なし) がいくつかあります

ClassB オブジェクトを objectA に追加しました。

objectA は NSManagedObject のサブクラスへの参照です... objectA.completeItem を呼び出すと、objectA に ItemB のセットを要求しています。これは、メモリ内の 1 つのインスタンスで作業しているため機能します。

新しい NSManagedObjectContext を作成してその中でフェッチを実行すると、フェッチを実行する前に objectA のコンテキストで保存を実行しない限り、objectA またはその関係について何も認識しません。

編集:

ItemA が所有する classB オブジェクトのみを除外する述語については、次のような述語を使用できます (itemA が ItemA cpmletedItem 関係の逆であると仮定します)。

[NSPredicate predicateWithFormat: @"itemA = %@",itemA];

于 2011-12-13T20:54:35.753 に答える