2

CoreDataTableViewControllerのサブクラスがあります(CoreDataとTableViewsをリンクするためにスタンフォード大学の人々が行ったUITAbleViewControllerドームのサブクラス)。このクラスでは、「definition」という属性で並べ替えて、fecthを実行したいと思います。それを実行するコードは、次のとおりです。

- (void)setupFetchedResultsController{


    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:self.entity];

    request.propertiesToFetch=[NSArray arrayWithObject:@"definition"];
    request.returnsDistinctResults=YES;

    NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"%K != nil", @"definition"]; 
    NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"%K != ''", @"definition"];
    NSPredicate *predicate3=  [NSPredicate predicateWithFormat:@"%K contains[cd] %@", @"definition", self.seachBar.text];

    NSArray *prepredicateArray;

    if ([self.seachBar.text length]) {
         prepredicateArray = [NSArray arrayWithObjects:predicate1, predicate2, predicate3,nil];

    }else {
         prepredicateArray = [NSArray arrayWithObjects:predicate1, predicate2,nil];

    }

    request.predicate=[NSCompoundPredicate andPredicateWithSubpredicates:prepredicateArray];
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"definition" ascending:YES ]];





    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                        managedObjectContext:self.managedObjectContext
                                                                          sectionNameKeyPath:nil
                                                                                   cacheName:nil];




    [self performFetch];


}

正しく理解できた場合は、request.returnsDistinctResults=YESを設定します。重複をフェッチしないようにする必要があります。ただし、機能せず、この属性の値の重複が表示されます。

私がそこに欠けているものはありますか?そこにいくつかの指摘をいただければ幸いです。前もって感謝します。

編集:誰かがここで同じ問題を抱えている場合、Davidの答えを適用した後、結果のfetchedResultsControllerは、要求された値のみを持つオブジェクトを持つNSDIctionaryであり、目的のみを表示するためには非常に問題ありません。セルラベルに結果を表示するためにcellForRowAtIndexPathで行ったことの1つは、次のとおりです。

HNMR *hnmr = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text=hnmr.definition;

cell.textLabel.text=[[self.fetchedResultsController objectAtIndexPath:indexPath] valueForKey:@"definition"];
4

2 に答える 2

13

ドキュメントからreturnsDistinctResults

この値は、に値が設定されている場合にのみ使用されpropertiesToFetchます。

ドキュメントからpropertiesToFetch

この値は、resultTypeがに設定されている場合にのみ使用されNSDictionaryResultTypeます。

ドキュメントからresultType

デフォルト値はですNSManagedObjectResultType


これはすべて、自分自身とデフォルトで辞書の代わりに管理対象オブジェクトを返すようにpropertiesToFetch設定していないため、が無視されることを示しています。は無視されるresultTypeため、も無視されます。したがって、まだ重複が発生しています。propertiesToFetchreturnsDistinctResults

管理対象オブジェクトではなくディクショナリを返すように結果タイプを設定してみてください。

request.resultType = NSDictionaryResultType;
于 2012-06-27T20:04:45.107 に答える
6

DavidRönnqvistの回答に加えて、コアデータを使用して個別の値を選択する際の便利なリンク(サンプル付き)を提案します。

core-data-how-to-do-a-select-distinct

お役に立てば幸いです。

于 2012-06-27T20:08:44.890 に答える