0

人々のグループの中から「最も古い」と「最も重い」を見つけるために、コア データにクエリを実行しています。より大きなデータセットでは、これは通常機能します (重複一致の可能性が少ないため) が、最も古い人物が最も重い人物である可能性がある小さなデータセットでは、問題が発生します。

[John, 77, 160]
[Pete, 56, 155]
[Jane, 19, 130]
[Fred, 27, 159]
[Jill, 32, 128]

この情報を 2UITableViewCell秒で表示したいのでUITableView、最初に 2 を実行してこれを行っています (1 つはOLDESTNSFetchRequestsを検索し、2 番目は HEAVIEST を検索します)。をセットアップするために使用しています。objectIDNSFetchRequestNSFetchedResultsController

// FETCH REQUEST - OLDEST, HEAVIEST
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"People"];
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:descriptor]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", IDArray];
[fetchRequest setPredicate:predicate];

ファイナルの「説明を出力」NSFetchRequestすると、実際には managedObjects への 2 つのポインターが含まれています。

(i.e. [John, 77, 160] [John, 77, 160])

私の問題は、私がそうするときのようです

[[self fetchedResultsController] performFetch:nil];

デリゲートUITableViewメソッド:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSArray *sectionArray = [[self fetchedResultsController] sections];
    id <NSFetchedResultsSectionInfo> sectionInfo = [sectionArray objectAtIndex:0];
    NSUInteger numberOfRows = [sectionInfo numberOfObjects];
    NSLog(@"ROWS: %u", numberOfRows);
    return numberOfRows;
}

numberOfRowsを 1 としてのみ表示し、単一の [John, 77, 160] のみを my に表示しますUITableView

4

1 に答える 1

1

フェッチ リクエストは、重複するオブジェクトを返しません。述語に一致するすべてのオブジェクトを返します。そう

[NSPredicate predicateWithFormat: @"objectID = %@", oid]
[NSPredicate predicateWithFormat: @"(objectID = %@) OR (objectID = %@)", oid, oid]
[NSPredicate predicateWithFormat: @"objectID IN %@", @[oid, oid]]

指定されたオブジェクト ID (存在する場合) を持つ 1 つのオブジェクトをすべて返します。

あなたの場合、表示したいオブジェクトがすでにあります。したがって、フェッチされた結果コントローラーを使用する代わりに、それらを配列に格納し、それをテーブル ビュー データ ソースとして使用することをお勧めします。

于 2013-03-20T12:34:29.013 に答える