我有一个具有日期属性的Core Data实体。我想写一个谓词来提取特定月份内的所有日期,例如七月,无论年份如何。怎么能实现这一目标?感谢
答案 0 :(得分:6)
您可以在您的实体上创建一个新方法,我们称之为monthOfDate
。此方法只使用[self dateAttribute]
和NSDateComponents
来提取日期的月份。
然后你可以编写一个谓词:
//assuming 1-based month indexing
NSPredicate * julyEntities = [NSPredicate predicateWithFormat:@"monthOfDate = 7"];
这里的技巧是认识到谓词的左键路径将导致方法调用。因此,如果将左键路径设置为“monthOfDate”,它将最终调用您的monthOfDate
方法并使用该方法的返回值作为谓词中的比较值。整齐!
答案 1 :(得分:0)
还不能发表评论,所以问这个方式。
你是如何最终实现的?我尝试在托管对象类中添加一个方法,但是一旦谓词触发它就说它无法找到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;