2016-01-19 2 views
2

Здравствуйте, я пытаюсь фильтровать только объекты, которые попадают под определенное время. Например, мне нужны только объекты, которые были до 8 часов утра или после 1 вечера.Фильтровать объекты данных ядра по времени

Если в моем объекте есть атрибут createdDate, и я хочу только получить объекты, созданные до 8AM, каким будет подход?

Я хотел сделать это, используя любой из этих подходов, но получал 0 результатов, опробовав оба подхода.

1.Created отдельный производный атрибут, который возвращает часть времени и делает фильтр на этом.

т.е. (Стойкие) createdDate -> (Derived) createdTimeByHour

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"createdTimeByHour < 10"]; 

2.Setup предикат фильтрации на основе конвертированного createdDate.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"createdDate.hour < 10"]; 

Попытки:

Я пытался реализовать первое решение, но NSFetchRequest не возвращается ко мне никаких результатов. Я создаю производный атрибут как так ...

- (NSNumber *)createdTimeByHour 
{ 

    NSNumber *result; 
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:[self createdDate]]; 
    result = @([components hour]); 

    return result; 
} 

ФОН ПРОБЛЕМА Я обнаружил, что я получаю 0 результатов, потому что я добавил полученные данные после того, как было уже существующие объекты в Core Data. Эти объекты не имеют значения в основных данных, но при попытке войти в него после получения всех результатов он создает производный результат, но никогда не сохраняет или не сохраняет данные в основных данных. Я надеялся, что мне не нужно будет хранить это в Core Data, но, в конце концов, имеет смысл сделать это, потому что я часто буду запрашивать это поле.

ПРОСТОЕ РЕШЕНИЕ Таким образом, в очень простом случае, в более раннем, чтобы фильтровать по времени, вы должны создать атрибут, который сохраняет это значение в основных данных. Насколько мне известно, вы не можете фильтровать по времени прямо из NSDate.

ДОПОЛНИТЕЛЬНОЕ РЕШЕНИЕ Если вы добавляете это поле, когда в основных данных уже есть объекты, вы должны обработать каждый объект в основных данных, чтобы сохранить этот результат.

ответ

1

Я думаю, что самый простой способ для Core Data - использовать решение 1, производное свойство, чтобы вернуть час дня. Вы также можете сохранить его (что вам нужно будет сделать, чтобы использовать его в NSFetchedResultsController); вы можете сделать это автоматически всякий раз, когда установлен createdDate (например, в awakeFromInsert).

E.g.

-(void) awakeFromInsert { 
    [super awakeFromInsert]; 
    self.createdDate = [NSDate date]; 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSDateComponents *comps = 
     [calendar components:NSCalendarUnitHour fromDate: [NSDate date]]; 
    self.hour = @(comps.hour); 
} 
+0

Благодарим за отзыв мунди. Проблема заключается в использовании NSFetchRequest, она не возвращает никаких значений. Я отредактировал вопрос выше, чтобы показать, как я создал производный атрибут. –

+0

Это другая проблема, связанная с вашими данными или заполнением полей данных. – Mundi

+0

Извините mundi за путаницу. Я отредактировал вопрос выше, чтобы показать, как я создал производный атрибут. Когда вы это делаете и проверяете первое решение, он возвращает 0 результатов. Это заставляет меня думать, что вы не можете фильтровать на основе полученных атрибутов. –

Смежные вопросы