Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 用于比较核心数据日期属性的月份组件的谓词_Objective C_Cocoa_Cocoa Touch_Core Data - Fatal编程技术网

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]调用该方法。我来看看什么是最直观的。谢谢