Получить наименьшую дату объекта в CoreData - PullRequest
2 голосов
/ 02 сентября 2011

У меня та же проблема, что и на этот вопрос , но ответ @davedelong для меня не работает.

Следуя примеру Apple , для получения наименьшей даты в наборе объектов я получаю следующую ошибку

-[NSDate count]: unrecognized selector sent to instance

Насколько я понимаю, максимум NSExpression: только поддержка NSArray s. Поэтому мне нужно другое решение.

@ davedelong предложил использовать восходящий NSSortDescriptor, и я сделал:

NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.entity = [NSEntityDescription entityForName:NSStringFromClass([GCSession class])
                                  inManagedObjectContext:self.objectContext];
fetchRequest.fetchLimit = 1;

NSSortDescriptor* sort = [[NSSortDescriptor alloc] initWithKey:@"startDate" ascending:YES];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:sort];

GCSession* session = [[self.objectContext executeFetchRequest:fetchRequest error:nil] lastObject];

return session.startDate;

Проблема здесь в том, что объект session, возвращаемый из выборки, не похож на объект с наименьшим startDate. В моих тестах кажется, что он даже возвратил новейшую дату, но это не кажется последовательным.

Я мог бы также извлекать каждый GCSession объект и сортировать их, но это кажется излишним, особенно если учесть, что GCSession будет увеличиваться в количестве, когда пользователи будут использовать приложение.

Редактировать : Тестовый проект , демонстрирующий ошибку в примере кода Apple.

1 Ответ

3 голосов
/ 02 сентября 2011

Сортировка вступает в игру только после того, как вы получили объекты. Вы установили предел выборки, равный одному, а не предикаты, которые говорят, что выборка «захватить любой случайный одиночный объект GCSession». Одна выборка имеет массив длиной 1 элемент, затем сортирует ее, что бесполезно.

Если вы хотите использовать сортировку для нахождения минимума или максимума, вам нужно выбрать все объекты и затем отсортировать их. Удаление строки:

fetchRequest.fetchLimit = 1;

… должен позволить коду работать.

Однако вы должны иметь возможность извлекать минимальные и максимальные значения с помощью выражений. Это своего рода базовая операция.

Редактировать: подробности смотрите в комментариях, но пример Apple может сработать, если вы измените хранилище резервных копий на SQL вместо XML

...