Search code examples
iosnsfetchedresultscontrollernsfetchrequest

NSFetchRequest / NSFetchedResultsController returning single property distinct but sorted using another attribute of the entity


I am using an NSFetchedResultsController to display data in a table. The data store contains lots of rows that have a groupID, and multiple entities can share a groupID.

Each entity has an insertion date property as well.

I would like to get a list of distinct groupID ordered by the insertion date property. The following code works, except it is not sorted by the insertion date property. I assume that since that property is not one of the ones being fetched, it is not available for sorting.

And I am using MagicalRecord as well, fwiw.

Is there a way to use other properties of the entity for sorting but not have them as part of the result? Adding in the insertion date to the fetched properties makes distinct superfluous since the dates are all unique as they are.

     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userID like[c] %@", THEUSERUSERID];

     NSFetchRequest *fetchRequest = [AnEntity MR_requestAllWithPredicate:predicate];
     [fetchRequest setReturnsDistinctResults:YES];
     [fetchRequest setResultType:NSDictionaryResultType];
     [fetchRequest setPropertiesToFetch:@[@"groupID"]];

     NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"inDate" ascending:NO];

     [fetchRequest setSortDescriptors:@[sortDescriptor]];

     _frController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[NSManagedObjectContext MR_rootSavingContext] sectionNameKeyPath:nil cacheName:nil];

Solution

  • Chadbag ... I had the same problem. I researched the setPropertiesToFetch and found out it requires an NSArray of NSPropertyDescriptions ... not just the attribute name.

    I think if you REMOVE this:

    [fetchRequest setPropertiesToFetch:@[@"groupID"]];
    

    and ADD this:

    NSDictionary *entityProperties = [entity propertiesByName];
    NSPropertyDescription *propDescription = [entityProperties objectForKey:@"groupID"];
    NSArray *propArray = [NSArray arrayWithObject:propDescription];
    [fetchRequest setPropertiesToFetch:propArray];
    

    That should work for you ... it did for me!