2011-09-15 9 views
18

"RemainingGaneProjections"というコアデータモデル内に定義されているフェッチ要求があります。そのフェッチ要求を実行し、結果をエンティティの属性の1つでソートする必要があります。私のコードは次のようになります。テンプレートから作成されたNSFetchRequestにソート記述子を適用する

NSFetchRequest *projectionsRequest = [model fetchRequestTemplateForName:@"RemainingGameProjections"]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"confidence" ascending:NO]; 
[projectionsRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

私はこのコードを実行しようとすると、それは次のようなメッセージでクラッシュ:私はsetSortDescriptorsメソッドを実行するときに、このクラッシュが発生したデバッガで確認している

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Can't modify a named fetch request in an immutable model.' 

私のNSFetchRequestに。私はなぜこれが起こるか把握できませんでした。

ここで何が起こっているかについての説明はありますか?ソートする必要があるデータを取得する際に使用する必要がある別のアプローチがありますか?

答えて

35

すべての場所のアップルのマニュアルでその答えを見つけました。フェッチ要求には置換パラメータがないため、fetchRequestFromTemplateWithNameの代わりにfetchRequestTemplateForNameメソッドを使用しました。

  1. 使用fetchRequestFromTemplateWithName:substitutionVariables:テンプレートは、置換変数を持っていない場合、あなたはどちらかでなければなりません

    :結局のところ、コアデータプログラミングガイドでは、このことを言うと、変数として nilを渡します引数;

  2. fetchRequestTemplateForName:および を使用して結果をコピーします。 fetchRequestTemplateForName:によって返されたフェッチ要求を使用しようとすると、例外が生成されます(「 不変モデル内の名前付きフェッチ要求を変更できません)。

は、私はこれを行うには、私のフェッチ要求の初期化修正:

NSFetchRequest *projectionsRequest = [[model fetchRequestTemplateForName:@"RemainingGameProjections"] copy]; 

をし、予想通り、今すべてが動作します。

+0

また、 'projectionsRequest'に対応する' release'を追加したとします。 –

+12

いいえ - このプロジェクトではARCを使用しています;) –

関連する問題