Search code examples
iosobjective-ccore-datansfetchrequest

core data fetch last 20 records in ascending order?


In my app i've some records in core data and i want to fetch last 20 records in ascending order i.e.. if there is 30 records than i want to fetch records from 11 to 30 in ascending order -

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"Messages" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    [fetchRequest setFetchLimit:20];
    NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                              initWithKey:@"messageId" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

    NSPredicate *predicate = [NSPredicate predicateWithFormat: @"((userId == %@) && (frndId == %@) )",uid, fid];
    [fetchRequest setPredicate:predicate];

    NSError *error;
    NSArray* dataArray = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
    for (Messages* msg in dataArray) {
//code here
} 

but it gives me first 20 records in ascending order and if i change to

NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                                  initWithKey:@"messageId" ascending:NO];

then i got last 20 records but that was in ascending order?Any suggestion would be appreciated.


Solution

  • you can use -

    //your code as it is till this line but with 
    //NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                                  initWithKey:@"messageId" ascending:NO];
    NSArray* dataArray = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
    
        NSArray *sortedArray;
        sortedArray = [dataArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
            NSString *first = [(Messages*)a messageId];
            NSString *second = [(Messages*)b messageId];
            return [first compare:second];
        }];
        for (Messages* msg in sortedArray) {
    //your code
    }
    

    Happy coding :P