NSFetchRequest谓词在过去24小时内的日期?

时间:2010-11-24 15:34:37

标签: iphone objective-c cocoa-touch core-data

我有一个名为RSSItem的核心数据实体,其日期属性名为publicationDate

有没有办法为NSFetchRequest创建一个谓词,其中包含过去24小时内发布日期的所有实体?

我试过这个:

NSString* expression = @"publicationDate.timeIntervalSinceNow >= -86400";
return [NSPredicate predicateWithFormat:expression];

但是这会产生一个nil谓词,从而匹配所有内容。

我希望有一个随时间变化的实时谓词。因此,具有NSDate实例的谓词是不可能的,因为它定义了不可变的单个时间点,而不是相对时间,例如过去24小时

2 个答案:

答案 0 :(得分:4)

我认为这应该有效:

[NSPredicate predicateWithFormat:@"publicationDate >= %@", [NSDate dateWithTimeIntervalSinceNow:-86400];

更新

您可以尝试使用其他方法来使实时谓词生效。我认为你必须更新谓词中用于触发过滤的实体的属性,所以即使你提出的谓词是可能的,你仍然需要遍历所有项目并伪造{{{ 1}}。

您可以尝试将bool属性publicationDate添加到shouldDisplay和方法`updateShouldDisplay'

RSSItem

然后,无论何时刷新RSS源,您都会遍历所有实体并调用- (void)updateShouldDisplay { self.shouldDisplay = [NSNumber numberWithBool:[self.publicationDate compare:[NSDate dateWithTimeIntervalSinceNow:-86400]] == NSOrderedDescending]; } 。您可能还需要从updateShouldDisplay致电updateShouldDisplay

只是为了完成谓词看起来像:

awakeFromFetch

我不是百分之百,但我认为你不能在NSPredicate中使用瞬态属性,这意味着你必须存储[NSPredicate predicateWithFormat:@"shouldDisplay == YES"]

答案 1 :(得分:0)

  • 相对日期不是问题。您不需要更改谓词。 “最后24小时”边界是相对于当前时间的固定时间点。创建一个NSDate并将其粘贴在谓词中(如上面Robert的回答)

  • 对于“live-ness”,您可以使用带有上述谓词的fetched属性,将截止日期/时间放在userInfo字典中。结果由CoreData缓存(因为真正的实时属性每次都会导致数据库查询,并且可能很昂贵)所以你需要调用NSManagedObjectContext refreshObject:来更新数据(比如,每当你完成插入一堆数据时)刷新后的新RSSItem