NSPredicate и CoreData - решите, является ли атрибут Date «сегодня» (или между прошлой ночью с 12 до сегодняшней ночи) в iOS - PullRequest
8 голосов
/ 22 февраля 2012

Я использую NSFetchedResultsController и UITableViewController для заполнения UITableView из базы данных CoreData.

У меня есть NSDate объект, сохраненный в этом атрибуте Date с меткой "startTime". Затем я пытаюсь получить только сегодняшние данные, используя NSPredicate, который выглядит следующим образом:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"startDate == %@",
                          todaysDate];

Я получаю ноль результатов. Я понимаю это, потому что NSDate объект просто содержит количество секунд или миллисекунд или что-то еще с 1 января 1970 года, верно? Таким образом, сравнивая 1111111111111 и 1111111111112, находясь в один и тот же день, мы получаем два различных NSDate объекта, которые не равны.

Итак, как можно отформатировать NSPredicate, чтобы он это делал? Я собираюсь угадать, что он создает два NSDate объекта: один в 12:00 прошлой ночью, а другой - в 12:00 сегодня вечером и сравнит startDate и выяснит, находится ли он между этими двумя NSDate s.

Я вроде как новичок в NSPredicate, так как это можно сделать?

1 Ответ

24 голосов
/ 22 февраля 2012

Использование NSCompoundPredicate.

NSPredicate *firstPredicate = [NSPredicate predicateWithFormat:@"startDate > %@", firstDate];
NSPredicate *secondPredicate = [NSPredicate predicateWithFormat:@"startDate < %@", secondDate];

NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:firstPredicate, secondPredicate, nil]];

Где firstDate это 12:00 утра, а secondDate это 12:00 вечера.

P.S. Вот как можно получить 12 утра этим утром:

NSCalendar *calendar = [NSCalendar calendar]; // gets default calendar
NSCalendarComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit) fromDate:[NSDate date]]; // gets the year, month, and day for today's date
NSDate *firstDate = [calendar dateFromComponents:components]; // makes a new NSDate keeping only the year, month, and day

Чтобы получить 12 утра сегодня вечером, измените components.day.

...