Получить наименьшую дату объекта в CoreData
У меня та же проблема, что и с этим вопросом, но ответ @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 ответ
Сортировка вступает в игру только после того, как вы получили объекты. Вы установили предел выборки, равный одному, а не предикаты, которые говорят, что выборка "захватить любой случайный одиночный объект GCSession". Одна выборка имеет массив длиной 1 элемент, затем сортирует ее, что бесполезно.
Если вы хотите использовать сортировку для нахождения минимума или максимума, вам нужно извлечь все объекты и затем отсортировать их. Удаление строки:
fetchRequest.fetchLimit = 1;
… Должен позволить коду работать.
Однако вы должны иметь возможность извлекать минимальные и максимальные значения с помощью выражений. Это своего рода базовая операция.
Изменить: посмотрите комментарии для более подробной информации, но пример Apple может работать, если вы измените хранилище резервных копий на SQL вместо XML