Диапазон дат в качестве предиката выборки - предикат NSDate между базовыми данными - PullRequest
3 голосов
/ 23 октября 2011

Я пытаюсь получить базовые элементы данных, хранящиеся в Базовых данных, отфильтрованных по диапазону дат в поле eventStartDate, которое имеет тип Date - я использую управляемый объект с именем Event, сгенерированный Xcode, для прокси для основного элемента данных.Когда я выполняю запрос на выборку, ничего не возвращается.Я попытался просмотреть журналы SQL и убедиться, что вызывается следующий sql, который выглядит правильно:

SELECT 0, t0.Z_PK FROM ZEVENT t0 WHERE ( t0.ZEVENTSTARTDATE > ? AND  t0.ZEVENTSTARTDATE <= ?) ORDER BY t0.ZEVENTSTARTDATE

Я ничего не получаю, когда пытаюсь po [mgtEventArray count], я получаю ноль на объекте,

мой код для получения:

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit ) fromDate:[NSDate date]];
NSDate *startDate = [calendar dateFromComponents:components];
[components setMonth:10];
[components setDay:0]; 
[components setYear:0]; 
NSDate *endDate = [calendar dateByAddingComponents:components toDate:startDate options:0];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"((eventStartDate > %@) AND (eventStartDate <= %@))",startDate,endDate];


NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];

[fetchRequest setPredicate:predicate];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortDescKey ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];

NSError *error = nil;
NSArray *mgtEventArray = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if(error != nil)
    NSLog(@"%@", error);
return mgtEventArray;

Ответы [ 3 ]

3 голосов
/ 23 октября 2011

Это выглядит так, как будто ваши переменные startDate и endDate будут содержать неожиданные значения. startDate от компонентов даты без дня и т. Д., А endDate от startDate.

Таким образом, я рекомендую ставить точки останова или операторы NSLog перед определением предиката, чтобы проверить эти значения.

Кроме того, не ясно, какой NSCalendar вы используете. Из документации :

Числа дня, недели, дня недели, месяца и года обычно основаны на 1, но могут быть исключения для календаря.

Так что, кажется, например, установка свойства day на 0 может быть проблематичной.

2 голосов
/ 23 октября 2011

Попробуйте использовать другой формат для предиката:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(eventStartDate > %@) AND (eventStartDate <= %@)",startDate,endDate];`

Размещайте паратезы вокруг отдельных утверждений, а не вокруг всего утверждения.

0 голосов
/ 27 августа 2014

После iOS 6, как уже было сказано, этот предикат работает.

  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"startDate > %@",[NSDate date];`

Спасибо.

...