Фильтр NSFetchedResultsController для удаления объектов с тем же именем - PullRequest
2 голосов
/ 14 декабря 2011

У меня есть эти объекты, которые являются уникальными, за исключением двух столбцов, один из которых я использую в качестве отображения в UITableView.UITableView часто показывает дубликаты из-за этого.Мне нужно как-то отфильтровать эти дубликаты.

УстановкаifreResult для FetchResult в этом случае не будет работать, поскольку это ограничивает функциональность NSFetchedResultsController и требует, чтобы REsultType был NSDictionary вместо подкласса управляемого объекта.

Неужели никто не знает, как я могу отфильтровать эти дубликаты, используя предикат?Помните, что каждое поле на этих объектах уникально, за исключением двух из них.

-(NSFetchedResultsController *) fetchGroupedObjects:(NSString *)entityDescription 
                                      sortField:(NSString *)sortField 
                                     withPredicate:(NSPredicate *)predicate  {

BPRAppDelegate *delegate = (BPRAppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = delegate.managedObjectContext;
//NSError *error;

//Fetch the data....
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:entityDescription inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSSortDescriptor *groupDescription = [[NSSortDescriptor alloc]
                                    initWithKey:GROUP_NAME ascending:YES];
//Sort by Category Name
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                    initWithKey:sortField ascending:YES];

NSMutableArray *sorts = [[[NSMutableArray alloc] init] autorelease];

[sorts addObject:sortDescriptor];
[sorts addObject:groupDescription];


[fetchRequest setSortDescriptors:sorts];
//[fetchRequest setResultType:NSDictionaryResultType];
//[fetchRequest setPropertiesToGroupBy:[entity.propertiesByName valueForKey:CONTRACTOR_NAME];


if (predicate != nil)
  [fetchRequest setPredicate:predicate];


//NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

//NSFetchResultsController

[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *fetchedResultsController = 
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                    managedObjectContext:context sectionNameKeyPath:GROUP_NAME 
                                               cacheName:nil]; //Don't use a cache
 [fetchRequest release];
 [sortDescriptor release];
 [groupDescription release];
 return fetchedResultsController; //You can't autorelease this thing... the requestor must  do that.

}

1 Ответ

0 голосов
/ 27 февраля 2012

Хотя может быть проще установить необязательное отношение «один к одному» обратно к себе (скажем, «ребенок»), чтобы затем можно было извлечь с помощью NSPredicate, где «child == nil», вы, конечно, можете выполнить пост-фильтрдостаточно просто в чистой цели C, используя [array enumerateObjectsUsingBlock:] или эквивалентный, и добавлять в результирующий массив только уникальные объекты по вашим критериям.

...