Пользовательский метод в управляемом объекте для предиката данных Core

Я хочу выполнить предикат на основе месяца сохраненного атрибута (NSDate). Я понимаю, что сравнение даты начала и окончания (установленной вручную) позволяет это сделать.

Но я чувствую, что пользовательский метод в классе Managed Object должен позволять это довольно легко, а? Ну, я пытался, но я не могу получить доступ к простому методу, используя предикат, запускающий его. Это каким-либо образом возможно?

Управляемые объектные файлы:

.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;
}

Это мой предикат:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"client == %@ AND monthOfDate == %d", clientMO,int 6];

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

Обновить

Приведенные выше файлы.h и.m взяты из автоматически сгенерированного класса 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,int 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;

1 ответ

Это оказывается возможным только тогда, когда МО уже загружены в память. (Уши)

В моем случае с FRC это не так, поэтому мне придется создать отдельный атрибут месяца, который сохраняется при создании МО.

Спасибо пользователю Run Loop за ответ на 4-летний вопрос!

Другие вопросы по тегам