按时间过滤核心数据对象
Filter core data objects by time
您好,我正在尝试仅过滤属于特定时间的对象。例如,我只想要上午 8 点之前或下午 1 点之后的对象。
如果我的对象中有一个 createdDate 属性,而我只想获取在早上 8 点之前创建的对象,那么该方法是什么?
我想通过使用这两种方法中的任何一种来实现,但是尝试这两种方法都得到了 0 个结果。
1.Created 一个单独的派生属性,return 是时间部分并对其进行过滤。
即(持久)createdDate -> (Derived)createdTimeByHour
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"createdTimeByHour < 10"];
2.Setup 谓词根据转换后的 createdDate 进行过滤。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"createdDate.hour < 10"];
尝试次数:
我已经尝试实施第一个解决方案,但 NSFetchRequest 没有 return 给我任何结果。我像这样创建派生属性...
- (NSNumber *)createdTimeByHour
{
NSNumber *result;
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:[self createdDate]];
result = @([components hour]);
return result;
}
背景问题
我发现我得到了 0 个结果,因为我在核心数据中已经存在对象之后添加了派生数据。这些对象在核心数据中没有价值,但在获取所有结果后尝试为其记录时,它会创建派生结果,但从不在核心数据中保存或存储数据。我希望我不需要将它存储在核心数据中,但最后,这样做是有意义的,因为我会经常查询这个字段。
简单的解决方案
所以在一个非常简单的情况下,在 older 中按时间过滤,你必须创建一个属性,将这个值存储在核心数据中。据我所知,您不能直接从 NSDate 按时间过滤。
高级解决方案
如果在核心数据中已经存在对象时添加此字段,则必须处理核心数据中的每个对象以存储此结果。
我认为 Core Data 最简单的方法是使用解决方案 1,派生 属性 到 return 一天中的小时。您也可以保留它(您需要这样做才能在 NSFetchedResultsController
中使用它);您可以在设置 createdDate
时自动执行此操作(例如在 awakeFromInsert
中)。
例如
-(void) awakeFromInsert {
[super awakeFromInsert];
self.createdDate = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comps =
[calendar components:NSCalendarUnitHour fromDate: [NSDate date]];
self.hour = @(comps.hour);
}
您好,我正在尝试仅过滤属于特定时间的对象。例如,我只想要上午 8 点之前或下午 1 点之后的对象。
如果我的对象中有一个 createdDate 属性,而我只想获取在早上 8 点之前创建的对象,那么该方法是什么?
我想通过使用这两种方法中的任何一种来实现,但是尝试这两种方法都得到了 0 个结果。
1.Created 一个单独的派生属性,return 是时间部分并对其进行过滤。
即(持久)createdDate -> (Derived)createdTimeByHour
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"createdTimeByHour < 10"];
2.Setup 谓词根据转换后的 createdDate 进行过滤。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"createdDate.hour < 10"];
尝试次数:
我已经尝试实施第一个解决方案,但 NSFetchRequest 没有 return 给我任何结果。我像这样创建派生属性...
- (NSNumber *)createdTimeByHour
{
NSNumber *result;
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:[self createdDate]];
result = @([components hour]);
return result;
}
背景问题 我发现我得到了 0 个结果,因为我在核心数据中已经存在对象之后添加了派生数据。这些对象在核心数据中没有价值,但在获取所有结果后尝试为其记录时,它会创建派生结果,但从不在核心数据中保存或存储数据。我希望我不需要将它存储在核心数据中,但最后,这样做是有意义的,因为我会经常查询这个字段。
简单的解决方案 所以在一个非常简单的情况下,在 older 中按时间过滤,你必须创建一个属性,将这个值存储在核心数据中。据我所知,您不能直接从 NSDate 按时间过滤。
高级解决方案 如果在核心数据中已经存在对象时添加此字段,则必须处理核心数据中的每个对象以存储此结果。
我认为 Core Data 最简单的方法是使用解决方案 1,派生 属性 到 return 一天中的小时。您也可以保留它(您需要这样做才能在 NSFetchedResultsController
中使用它);您可以在设置 createdDate
时自动执行此操作(例如在 awakeFromInsert
中)。
例如
-(void) awakeFromInsert {
[super awakeFromInsert];
self.createdDate = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comps =
[calendar components:NSCalendarUnitHour fromDate: [NSDate date]];
self.hour = @(comps.hour);
}