0

次のエンティティがあります。

Student
  NSString name
  Team inTeam // reverse of Team.students

Team
  NSSet assignments
  NSOrderedSet students // reverse relationship of Student.inTeam

Assignment
  NSDate date // timeless date, only care about the day
  NSNumber assignmentCount
  Team inTeam // reverse of Team.assignmets

すべての生徒がチームの一員ではありません。すべてのチームに課題があるわけではありません。チームは通常 2 人の生徒 (3 人以下) で構成されます。

すべてのチームについて、そのメンバーの名前と特定の日付の割り当てカウントを表示する必要があります。

これを行うにはさまざまな方法が考えられますが、そのうちの 3 つは次のとおりです。

  1. 指定された日付のチーム クエリ割り当てごとに、すべてのチームを取得します。これは効率的ではありません (ただし、assignmentCount を障害オブジェクトとして持つ単一のクエリですべてを取得するのとほとんど同じですか?)

  2. すべてのチームのコレクションを保持し、指定された日付のすべての課題のコレクションを保持します。クエリは 2 つだけですが、2 番目のコレクションを db と同期させる必要があります (assignmentCount は変更されるため、これは行わない方がよいでしょう)。

  3. assignmentCount が変更されるたびにデータをリロードします。明らかに良い解決策ではありません

このすべての情報を 1 回のクエリで取得する方法はありますか?

私が見る問題は、述語を次のようなものに設定すると、ANY team.assignments.date = %@割り当てのあるチームのみが返されることです。

何か案は?

4

2 に答える 2

0

フェッチされた結果コントローラー (または少なくとも結果をページングするフェッチ要求) を使用します。FRC は、Teamオブジェクトの直接的な変更と、リストをスクロールするときのストアからの効率的な読み込みを管理します。

常に必要になることがわかっている関係から情報をプリフェッチするようにフェッチ要求を構成できます。追加のフェッチ要求ではなく、関係を使用してその情報を取得する必要があります。

の場合assignmentCount for a given date、これは新しいフェッチの良い候補です。実際には割り当ては必要ないので、countForFetchRequest:error:制限する述語を使用して設定しteam == ...ます。

于 2013-08-23T06:37:09.033 に答える
0

これは非常に効率的です。

1) 適切な述語でチームをフェッチします。

[NSPredicate predicateWithFormat:
   @"ANY assignments.date > %@ && assigments.date < %@", 
   dateStartTime, dateEndTime];

2) 次のようにデータにアクセスします。

NSOrderedSet *students = team.students;
NSUInteger assignments = team.assignments.count;

それがCore Dataの理由です。バックグラウンドですべての最適化を行います。を使用するNSFetchedResultsControllerと、テーブルビューに変更を通知できます。すべての作業は必要ありません。

はい、割り当てのないチームはフェッチに含まれないというのは正しいです。これは、日付でフィルタリングする場合の意図的な動作です。

于 2013-08-23T14:32:36.467 に答える