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

Iphone 日期在过去24小时内的NSFetchRequest谓词?,iphone,objective-c,cocoa-touch,core-data,Iphone,Objective C,Cocoa Touch,Core Data,我有一个名为RSSItem的核心数据实体,其日期属性名为publicationDate 是否有一种方法可以为NSFetchRequest创建谓词,该谓词将包含发布日期在过去24小时内的所有实体 我试过这个: NSString* expression = @"publicationDate.timeIntervalSinceNow >= -86400"; return [NSPredicate predicateWithFormat:expression]; 但这会产生一个nil谓词,从而

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

是否有一种方法可以为
NSFetchRequest
创建谓词,该谓词将包含发布日期在过去24小时内的所有实体

我试过这个:

NSString* expression = @"publicationDate.timeIntervalSinceNow >= -86400";
return [NSPredicate predicateWithFormat:expression];
但这会产生一个
nil
谓词,从而匹配所有内容


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

我认为这应该可以:

[NSPredicate predicateWithFormat:@“publicationDate>=%@,[NSDate Date WithTimeIntervalencesInnow:-86400];

更新 您可以尝试另一种方法使活动谓词工作。我认为您必须更新谓词中使用的实体的属性以触发筛选,因此,即使您建议的谓词是可能的,您仍然必须循环所有项并为
publicationDate
伪造更新

您可以尝试向
RSSItem
添加一个bool属性
shouldDisplay
,并添加一个方法“updateShouldDisplay”

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

为了完整起见,谓词如下所示:

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

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

  • 对于“live ness”,您可以将获取的属性与上述谓词一起使用,将截止日期/时间放入userInfo字典中。结果由CoreData缓存(因为真正的live属性每次都会导致DB查询,而且可能会很昂贵)因此,您需要调用
    NSManagedObjectContext refreshObject:
    来更新数据(比如,在刷新后插入一组新的
    RSSItem
    s)


我应该更新我的问题,我希望有一个实时查询,随着时间的推移更新结果集。我的错误在于错过了这条非常重要的信息。