Предикат для сравнения компонента месяца атрибута даты Базовых данных - PullRequest
1 голос
/ 29 мая 2010

У меня есть объект Core Data, который имеет атрибут даты.Я хотел бы написать предикат для извлечения всех дат в течение определенного месяца, например, июля, независимо от года.Как этого достичь?Спасибо

Ответы [ 2 ]

6 голосов
/ 29 мая 2010

Вы можете создать новый метод для вашей сущности, который мы назовем monthOfDate. Этот метод просто использует [self dateAttribute] и NSDateComponents, чтобы извлечь месяц даты.

Затем вы можете написать предикат:

//assuming 1-based month indexing
NSPredicate * julyEntities = [NSPredicate predicateWithFormat:@"monthOfDate = 7"]; 

Хитрость здесь заключается в том, чтобы понять, что левая траектория вашего предиката приведет к вызову метода. Поэтому, если вы установите левый путь к ключу «monthOfDate», он в итоге вызовет ваш метод monthOfDate и использует возвращаемое значение метода в качестве значения сравнения в предикате. Ухоженная!

0 голосов
/ 12 июня 2014

пока не могу комментировать, поэтому спрашиваю об этом.

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

Обновлено с обоими файлами:

.h файл:

@property (nonatomic,retain) NSNumber *monthOfDate;
-(NSNumber *)monthOfDate;

.m файл:

@synthesize monthOfDate;

-(NSNumber *) monthOfDate
{
NSDate *date = [self start];
NSDateComponents *components = [[NSCalendar currentCalendar]components: NSCalendarUnitMonth fromDate:date];
NSNumber *month = [NSNumber numberWithInteger:[components month]];
return month;
}

Обновление 2

Приведенный выше код находится в автоматически сгенерированном классе Event (объект NSmanaged). Я мог бы переместить свой пользовательский код в категорию позже, но пока пересмотр модели не требуется.

Ниже приведена настройка FetchedResultsController (в классе uiviewcontroller) с указанным предикатом:

NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"Event" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sortfix = [[NSSortDescriptor alloc]initWithKey:@"timeStamp" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortfix,nil]];
[fetchRequest setFetchBatchSize:20];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"client == %@ AND monthOfDate = %d", clientMO,[NSNumber numberWithInteger:6]];
[fetchRequest setPredicate:predicate];


NSFetchedResultsController *theFetchedResultsController =

[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:managedObjectContext sectionNameKeyPath:sectionKeyPathProperty
                                               cacheName:nil];

//sectionKeyPathProperty is a variable that let's me choose one of multiple transient properties I have created for creating relevant sections.

self.fetchedResultsControllerClient = theFetchedResultsController;
_fetchedResultsControllerClient.delegate = self;

return _fetchedResultsControllerClient;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...