0

Apple のドキュメントからの説明が必要です

フェッチ要求には、少なくとも 1 つのソート記述子が必要です。コントローラーがセクションを生成する場合、配列内の最初のソート記述子を使用して、オブジェクトをセクションにグループ化します。そのキーは sectionNameKeyPath と同じであるか、そのキーを使用する相対順序が sectionNameKeyPath を使用する順序と一致する必要があります

NSFetchedResultsController次の方法で with セクションを使用しています

[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:mainContext
                                      sectionNameKeyPath:@"paymentDate"
                                               cacheName:nil];

ドキュメントから理解したように、少なくとも並べ替え記述子NSFetchRequestを渡す必要があります。NSFetchedResultsControllerただし、セクションを使用するため、ソート記述子は次のようにする必要があります。

[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:
        [NSSortDescriptor sortDescriptorWithKey:@"paymentDate" ascending:YES],
        [NSSortDescriptor sortDescriptorWithKey:@"paymentCode" ascending:YES],
        nil]];

次のようなソート記述子を使用する場合

[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:
        [NSSortDescriptor sortDescriptorWithKey:@"paymentCode" ascending:YES],
        nil]];

次のようなエラーが表示されます

NSFetchedResultsController エラー: インデックス X でフェッチされたオブジェクトには、順不同のセクション名 Y があります。オブジェクトはセクション名でソートする必要があります'

私の場合、 を使用[NSSortDescriptor sortDescriptorWithKey:@"paymentDate" ascending:YES]すると、問題を克服できます。たぶん私はラッキーです;)。

しかし、それはどういう意味ですか、またはそのキーを使用した相対的な順序は、 sectionNameKeyPath を使用したものと一致する必要がありますか? 説明をいただけますか?

前もって感謝します。

4

1 に答える 1

1

セクションを使用している場合、FRC は、すべての結果をセクションごとにグループ化できるように、データの配列をソートする方法を知る必要があります。したがって、フェッチ要求で最初の並べ替え記述子として指定するものは、FRC が適切に処理できるように、セクションをグループ化する方法と一致する必要があります。

正確なフィールドを指定する必要はありませんが、並べ替え順序は同じにする必要があります。

たとえば、セクションを参照していなくても、最初のソート記述子がセクションごとに配列をグループ化する場合は問題ありません。ほとんどの場合、セクション属性を明示的に指定して、FRC 側で混乱が生じる可能性を排除する必要があります。そうしないと、例外がスローされます。

編集

たとえば、 と の 2 つのソート記述子があるsd1としsd2ます。 sd1で FRC に提供されたものと同じキーを使用しsectionNameKeyPathます。 sd2別のキーを使用します。

配列全体をソートするとき、両方が同じセクション内のエンティティをグループ化する最終的な配列を生成する場合、最初のソート記述子としてまたは のいずれsd1かを使用できます。sd2

基本的に、FRC は に基づいてエンティティをセクションにグループ化し、sectionNameKeyPath セクションの数と各セクションの行数を判断できるようにします。したがって、入力として取得する配列は、sectionNameKeyPath.

配列をトロールするとき、 を調べsectionNameKeyPathて、同じ を持つ特定の数のエントリが表示されることを期待しますsectionNameKeyPath。したがって、すべてのセクションをまとめるには、配列をソートする必要があります。

最初のソート記述子と同じキーを指定せずにそれを達成できれば、すべてうまくいきます。そうでない場合は、最初のソート記述子と同じセクション キーを使用する必要があります。

于 2012-09-03T15:12:49.740 に答える