2012-12-14 36 views
0

我正在研究一个核心数据项目,我有一个包含modification_date字段的表, 我需要提取最后的n天的所有条目,这些条目也有一个(假设)1PM和9PM之间的修改日期。按日期和时间跨度核心数据搜索

我已经整理出部分的溶液中的最后ñ天只提取项 像提示:Core Data- predicate with dates

NSDate *today = [NSDate date]; 
NSDate *end_day = [today addTimeInterval: (days*86400.0f)]; 
day_st = [NSString stringWithFormat: @"(timestamp >= %@) AND (timestamp <= %@) AND ", today, end_day]; 

我唯一的问题,现在,将加入由过滤器时间跨度。 但是,除了让foreach检查结果中每个元素的时间外,我不能想出任何聪明的东西。

回答

1

如果您在数据模型中存储日期类型字段,那么没有好的办法。那些被存储为自引用日期以来的秒数 - 所以在NSDate上的过滤工作,因为它是同样的事情。但是,您不能基于日期组件构建谓词(比如一天中的某个小时),因为数据存储区不知道这些谓词。在从数据存储中获取结果后过滤结果在大多数情况下是合理的方法。

如果这是您要做的很多事情,您可以考虑添加一个或多个新的属性 - 例如,您存储一天中的小时的整数字段。然后,您可以在NSPredicate中包含这些字段。每次更改日期字段时,请设置这些字段的值。并且,该死的确保你知道这些字段在的什么时区。 UTC是更可取的。当地时间正在寻求麻烦。有了UTC,你可以在设置字段值之前和获取之前将“1PM”,“9PM”等转换为UTC中的等效值。

最后(你可能已经意识到这一点,但从你的问题来看并不明显),请注意,你链接到的另一个问题是建立一个NSPredicate,而你有一个NSString那里。

1

我说你正在寻找与像一个谓词来结束:

((timestamp >= <startTimeOnDayOne>) AND (timestamp <= <endTimeOnDayOne>)) OR 
((timestamp >= <startTimeOnDayTwo>) AND (timestamp <= <endTimeOnDayTwo>)) OR 
[...] 

在你是如何制定适当的可可日期对象而言,你可能会想种子2 NSDateComponents ,一个是开始时间,一个是结束时间,另一个是简单地说'有一天'。然后使用NSCalendar(只是当前的日历,如果你对此含糊不清)以及它的dateFromComponents:dateByAddingComponents:toDate:options:方法 - 前者将获得第一天的日期,然后后者每天提前一天。

如果您试图在每个关口增加24小时,您将在夏令时的任何地区每年获得两次错误结果。

你可以建立起来NSPredicate S代表各有关日子到一个数组,然后用NSCompoundPredicate +orPredicateWithSubpredicates:胶水他们一起到一个单一的谓语结尾,让你不用担心有多少是在运行时ñ天。