Objective c 用于比较核心数据日期属性的月份组件的谓词
我有一个具有日期属性的核心数据实体。我想写一个谓词来提取特定月份内的所有日期,例如七月,而不考虑年份。如何做到这一点?谢谢您可以在您的实体上创建一个新方法,我们称之为Objective c 用于比较核心数据日期属性的月份组件的谓词,objective-c,cocoa,cocoa-touch,core-data,Objective C,Cocoa,Cocoa Touch,Core Data,我有一个具有日期属性的核心数据实体。我想写一个谓词来提取特定月份内的所有日期,例如七月,而不考虑年份。如何做到这一点?谢谢您可以在您的实体上创建一个新方法,我们称之为monthoffate。此方法仅使用[self dateAttribute]和NSDateComponents提取日期的月份 然后您可以编写一个谓词,该谓词执行以下操作: //assuming 1-based month indexing NSPredicate * julyEntities = [NSPredicate predi
monthoffate
。此方法仅使用[self dateAttribute]
和NSDateComponents
提取日期的月份
然后您可以编写一个谓词,该谓词执行以下操作:
//assuming 1-based month indexing
NSPredicate * julyEntities = [NSPredicate predicateWithFormat:@"monthOfDate = 7"];
这里的技巧是认识到谓词的左键路径将导致方法调用。因此,如果将left键路径设置为“monthoftate”,它将调用
monthoftate
方法,并使用该方法的返回值作为谓词中的比较值。干净利落 您可以在您的实体上创建一个新方法,我们称之为monthoffate
。此方法仅使用[self dateAttribute]
和NSDateComponents
提取日期的月份
然后您可以编写一个谓词,该谓词执行以下操作:
//assuming 1-based month indexing
NSPredicate * julyEntities = [NSPredicate predicateWithFormat:@"monthOfDate = 7"];
这里的技巧是认识到谓词的左键路径将导致方法调用。因此,如果将left键路径设置为“monthoftate”,它将调用
monthoftate
方法,并使用该方法的返回值作为谓词中的比较值。干净利落 还不能评论,所以请这样问
你是如何实现这一点的?我尝试在托管对象类中添加一个方法,但一旦谓词触发,它就会说找不到keypath monthoftate
已更新两个文件:
.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
上面的代码位于自动生成的事件类(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;
现在还不能评论,所以这样问吧 你是如何实现这一点的?我尝试在托管对象类中添加一个方法,但一旦谓词触发,它就会说找不到keypath monthoftate 已更新两个文件: .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
上面的代码位于自动生成的事件类(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;
请认识到,这只适用于已经加载到内存中的数据。要对尚未提取的数据执行相同的操作,您需要对数据进行反规范化,并将该值存储在数据库中。请意识到,这仅适用于已加载到内存中的数据。要对尚未获取的数据执行相同的操作,您需要对数据进行反规范化,并将该值存储在数据库中。您是否将属性声明放在头文件(.h)中?是的,我已将上面的代码更新为现在的代码。只是尝试了很多东西,也把它改成了一个NSN号码。仍然存在相同的“实体中未找到keypath monthOfDate”错误。我想我可以把一些额外的属性保存到我的表中并进行大量的比较,但我觉得这应该可以工作(如果可以的话,会很顺利),所以我真的想尝试让它工作:)请显示您的代码,您在哪里设置了fetchRequest,并让我知道您创建“monthOfDate”的类的名称方法道歉,花了一些时间来思考我最终实现这一点的方式。只有在提取基本对象后,将所有MO加载到内存(即)后,此操作才会起作用。由于这对您的场景不实际,您需要在表架构中创建一个monthOfDate字段,并在首次创建/保存MO时填充它。不,不,谢谢您回复4yo线程!)啊!这就是马库斯·s·扎拉在评论中的意思。如果它能做到这一点,那就太好了!然后我将为它创建一个新属性。尽管我认为,如果我需要对FRC的结果进行一些小的修改,我可能会循环使用FRC的结果,然后从[EventMO.timeStamp monthoftate]调用该方法。我来看看什么是最直观的。再次感谢运行循环!您是否将属性声明放在头文件(.h)中?是的,我已将上面的代码更新为现在的代码。只是尝试了很多东西,也把它改成了一个NSN号码。仍然存在相同的“实体中未找到keypath monthOfDate”错误。我想我可以把一些额外的属性保存到我的表中并进行大量的比较,但我觉得这应该可以工作(如果可以的话,会很顺利),所以我真的想尝试让它工作:)请显示您的代码,您在哪里设置了fetchRequest,并让我知道您创建“monthOfDate”的类的名称方法道歉,花了一些时间来思考我最终实现这一点的方式。只有在提取基本对象后,将所有MO加载到内存(即)后,此操作才会起作用。由于这对您的场景不实际,您需要在表架构中创建一个monthOfDate字段,并在首次创建/保存MO时填充它。不,不,谢谢您回复4yo线程!)啊!这就是马库斯·s·扎拉在评论中的意思。如果它能做到这一点,那就太好了!然后我将为它创建一个新属性。尽管我认为,如果我需要对FRC的结果进行一些小的修改,我可能会循环使用FRC的结果,然后从[EventMO.timeStamp monthoftate]调用该方法。我来看看什么是最直观的。谢谢