2012-10-05 17 views
6

セットアップ:親オブジェクトのコレクションがあり、ObjectAと呼びます。各ObjectAは、ObjectBと1対多の関係にあります。したがって、1つのObjectAには0..n ObjectB-sが含まれ、各ObjectBにはその親として特定のObjectAがあります。関連オブジェクトコレクションの属性に基づいてコアデータの結果をソートする方法はありますか?

ここで、最新のObjectBでソートされているObjectA-sのCore Dataフェッチを行いたいと思います。そのためのソート記述子を作成することは可能ですか?

まったく同じ状況を表すa related questionがあります。その答えは、ObjectBの属性をObjectAに非正規化することを示唆しています。 1つのフェッチ要求でこれを行う方法が本当にない場合は、これは問題ありません。

関連する質問も言及:

Actually, I just had an idea! Maybe I can sort Conversations by [email protected]

私が試しました。それは可能ではないようです。

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 
[email protected]' 

はObjectAにに属性のみ/最適なソリューションを非正規化されています:私はこのエラーを取得しますか?

答えて

0

あなたは、あなたはこのような何か行うことができますフェッチ要求では、追加の日付のタイムスタンプであるObjectBに中に属性を追加することができます。

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"objectB.addTime" ascending:YES]; 
... 
fetchRequest.sortDescriptors = @[descriptor]; 
+2

これは私にとってはうまくいかなかった: 'NSInvalidArgumentException'、理由: 'to-manyキーはここで許可されていません' –

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インスタンスがすでに存在するかどうかを調べ、配列に追加していない場合は配列に追加します。

ObjectBsをソートすることは重要です。そうでなければ、この練習は無意味です。

関連する問題