2

現在、CoreData の実装に問題があります。特定のプロパティを持つオブジェクトの数をクエリしようとしています。したがって、次のコードを実行します

NSUInteger itemsCount = [managedObjectContext countForFetchRequest:fetchRequest error:NULL];
NSLog(@"%i",(int)itemsCount);

ここまでは順調ですね。データが保存されていない新しいMOCで作業すれば、すべてが機能します。次の操作を行うと、問題が発生します。

  • MOC全体を保存します
  • フェッチ基準に一致するオブジェクトの 1 つを MOC から削除します (保存せずに!)
  • 基準に一致するオブジェクトの数を再クエリします

オブジェクトの 1 つを削除しても、オブジェクトの数は変わりません。次のクエリも試しました...

fetchRequest.resultType = NSCountResultType;
NSArray* array = [managedObjectContext executeFetchRequest:fetchRequest error:&fetchError];
NSLog(@"%i",[[array firstObject] intValue]);

...同じ結果です。

次に、オブジェクトを直接クエリしてみました...

fetchRequest.resultType = NSManagedObjectResultType;
array = [managedObjectContext executeFetchRequest:fetchRequest error:&fetchError];
NSLog(@"%i",(int)[array count]);

... 多田:ここでは動作します。配列には、削除されたオブジェクトは含まれていません。fetchRequest.includesPendingChanges = NO を設定すると、まだ保存していないため、もちろんすべてのオブジェクトを取得します。最初の 2 つのクエリでは、最初に表示されるオブジェクトが多すぎるため、このプロパティは効果がありません。

私の質問は、私が間違っていることと、オブジェクトを永続ストアに保存した後、適切な量のオブジェクトを取得できない理由です。保存後に MOC をリセットする必要がありますか?

-------------------------------------------------- ------------------------------

アップデート

同様の問題をさらに検索したところ、興味深い投稿がいくつか見つかりました。MOC からオブジェクトをフェッチするということは、永続ストアにもクエリを実行することを意味します。変更をすぐに保存しなかったため、削除されたオブジェクトと新しく挿入されたオブジェクトをそれぞれフェッチするかどうかを指定します。しかし奇妙なことに、これは辞書の結果タイプまたはカウントフェッチを含むクエリにのみ適用されます。オブジェクト自体をクエリすると、新しく挿入されたオブジェクトと削除されたオブジェクトを含め、正しい数のオブジェクトが取得されます。

今、私は自分の問題に対処する方法を考えています。NSFetchedResultsController (NSFRC) とスムーズに連携するテーブル ビューがあります。コントローラーがすべての更新を処理して通知するため、変更を保存する必要はありません。しかし、データを挿入または削除し、NSFRC が通知するとすぐに、さらに計算を行って他のビューを更新したいと考えています。これらの計算には、特定の属性を持つオブジェクトの平均と数などが含まれます。現在、挿入または削除デリゲート メソッドが呼び出されるとすぐに、これらのビューを更新します。しかし、これらのクエリは正しい値を返しません。クエリを実行する前に以下を呼び出しても、これらのクエリには影響しません。

[moc processPendingChanges]
fetch.includePendingChanges = YES

どうやら私のアプローチには何かが欠けているようです。必要な値を正しく取得するにはどうすればよいですか? 私のNSFRCは明らかに削除され挿入された値を追跡しているので、平均を取得するためだけに2番目のNSFRCを作成するのに役立つかどうか興味がありますか? それも可能ですか?

ありがとう!

4

0 に答える 0