Пользовательский метод в управляемом объекте для предиката данных 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-летний вопрос!