6

セットアップ: 親オブジェクトのコレクションがあり、それらを ObjectA と呼びます。各 ObjectA には、ObjectB との 1 対多の関係があります。したがって、1 つの ObjectA には 0..n 個の ObjectB が含まれる場合があり、各 ObjectB には特定の ObjectA が親として含まれます。

ここで、ObjectA の Core Data fetch を実行したいと思います。ここでは、最新の ObjectB によってソートされます。そのためのソート記述子を作成することは可能ですか?

まったく同じ状況を説明する関連する質問があります。答えは、属性を ObjectB から ObjectA に非正規化することを提案しています。1 回のフェッチ要求でこれを行う方法が本当にない場合は、これで問題ありません。

関連する質問では、次のことも言及されています。

実は、ちょっと思いつきました!会話をメッセージで並べ替えることができるかもしれません.@max.sortedDate…</p>

私は試した。それは不可能のようです。次のエラーが表示されます。

2012-10-05 17:51:42.813 xxx[6398:c07] *** Terminating app due to uncaught
exception 'NSInvalidArgumentException', reason: 'Keypath containing
KVC aggregate where there shouldn't be one; failed to handle
ObjectB.@max.creationTime'

属性を ObjectA に非正規化するのは唯一の/最良の解決策ですか?

4

2 に答える 2

0

追加日のタイム スタンプである ObjectB に属性を追加すると、フェッチ リクエストで次のようなことができます。

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"objectB.addTime" ascending:YES];
...
fetchRequest.sortDescriptors = @[descriptor];
于 2013-05-01T17:35:48.667 に答える
0

この質問が少し古いことは知っていますが、私が行ったことは、すべての ObjectB を取得し、結果を反復処理し、ObjectB プロパティを取り出して新しい配列に追加することでした。

NSFetchRequest *fetchRequest = [NSFetchRequest new];
[fetchRequest setEntity:self.entityDescForObjectB];

// sort
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
[fetchRequest setSortDescriptors:@[sortDescriptor]];

NSError *error = nil;
NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
    NSLog(@"Error fetching objects: %@", error.localizedDescription);
    return;
}

// pull out all the ObjectA objects
NSMutableArray *tmp = [@[] mutableCopy];
for (ObjectB *obj in fetchedObjects) {
    if ([tmp containsObject:obj.objectA]) {
        continue;
    }
    [tmp addObject:obj.objectA];
}

これは、CoreData がオブジェクト グラフであるため、逆方向に作業できるため機能します。tmp最後のループは基本的に、配列に特定の ObjectA インスタンスが既にあるかどうかを確認し、そうでない場合はそれを配列に追加します。

ObjectB を並べ替えることが重要です。そうしないと、この演習は無意味になります。

于 2015-03-03T14:44:05.420 に答える