Search code examples
iosobjective-cnspredicatensfetchedresultscontrollernsfetchrequest

Two predicates for same property in iOS


I have a bookingDate attribute, and I am trying to apply two different conditions for fetching based on bookingDate.

    NSPredicate *confirmBookingPredicate = [NSPredicate predicateWithFormat:@"bookingDate > %@ AND ANY cab.confirmationStatus == 1 OR cab.confirmationStatus == 0", [NSDate date]];
    NSPredicate *cancelBookingPredicate = [NSPredicate predicateWithFormat:@"bookingDate < %@ AND bookingDate >= %@ AND ANY cab.confirmationStatus == 1", [NSDate date], [NSDate dateWithNoTime:[[NSDate date] dateByAddingTimeInterval:MINUSFORTYFIVEDAYS]]];

    NSPredicate *nilPredicate = [NSPredicate predicateWithFormat:@"cab.@count != 0"];
    NSPredicate *DatePredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[confirmBookingPredicate, cancelBookingPredicate, nilPredicate]];

    NSFetchedResultsController *fetchedResultsController;

    NSFetchRequest *fetchRequest = [Trip MR_requestAllSortedBy:@"bookingDate" ascending:YES];
    [fetchRequest setFetchBatchSize:10];
    [fetchRequest setPredicate:DatePredicate];
    [fetchRequest setReturnsObjectsAsFaults:NO];
    fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_defaultContext sectionNameKeyPath:@"bookingId" cacheName:nil];

But its not functioning as expected. I don't understand why. Kindly guide.


Solution

  • You said that you want all booking (confirmed/cancelled) which are in future, and only cancelled bookings which are before today's date. Try following predicate for that.

    NSPredicate *futureBookings = [NSPredicate predicateWithFormat:@"bookingDate > %@", [NSDate date]];
    NSPredicate *cancelledPreviousBookings = [NSPredicate predicateWithFormat:@"bookingDate < %@ AND cab.confirmationStatus == 1", [NSDate date]];
    NSPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[futureBookings, cancelledPreviousBookings]];