用于比较Core Data日期属性的月份组件的谓词

时间:2010-05-29 15:01:53

标签: objective-c cocoa cocoa-touch core-data

我有一个具有日期属性的Core Data实体。我想写一个谓词来提取特定月份内的所有日期,例如七月,无论年份如何。怎么能实现这一目标?感谢

2 个答案:

答案 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;