按时间过滤核心数据对象

时间:2016-01-19 19:28:05

标签: objective-c core-data nspredicate nsfetchrequest

您好我试图仅过滤掉一定时间内的对象。例如,我只想要在上午8点之前或下午1点之后的对象。

如果在我的对象中有一个createdDate属性,我只想获取在8AM之前创建的对象,那么这样做的方法是什么?

我想通过使用这些方法中的任何一种来实现,但是尝试了两种方法都得到了0结果。

1.处理一个单独的派生属性,该属性返回时间部分并对其进行过滤。

即。 (持久)createdDate - > (导出)createdTimeByHour

fileID = fopen('test2.txt','w');
formatSpec='%s %d %d %d';
fprintf(fileID,formatSpec,P{:});
fclose(fileID);

2.根据转换后的createdDate设置谓词进行过滤。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"createdTimeByHour < 10"];

尝试:

我已尝试实施第一个解决方案,但NSFetchRequest并没有向我返回任何结果。我像这样创建派生属性......

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"createdDate.hour < 10"];   

背景问题 我发现我得到0结果,因为我在Core Data中已经存在对象之后添加了派生数据。这些对象在核心数据中没有值,但是在获取所有结果后尝试记录它时,它会创建派生结果,但永远不会将数据保存或存储在核心数据中。我希望我不需要将它存储在Core Data中,但最后,这样做是有意义的,因为我经常会通过这个字段查询。

简单的解决方案 因此,在一个非常简单的情况下,在较旧的情况下按时间过滤,您必须创建一个将此值存储在核心数据中的属性。根据我的知识,你无法直接从NSDate过滤。

高级解决方案 如果在核心数据中已存在对象时添加此字段,则必须处理核心数据中的每个对象以存储此结果。

1 个答案:

答案 0 :(得分:1)

我认为Core Data最简单的方法是使用解决方案1,派生属性返回当天的小时。你也可以坚持它(你需要在NSFetchedResultsController中使用它);您可以在设置createdDate时自动执行此操作(例如,在awakeFromInsert中)。

E.g。

-(void) awakeFromInsert {
   [super awakeFromInsert];
   self.createdDate = [NSDate date];
   NSCalendar *calendar = [NSCalendar currentCalendar];
   NSDateComponents *comps = 
      [calendar components:NSCalendarUnitHour fromDate: [NSDate date]];
   self.hour = @(comps.hour);
}