【问题标题】:NSFetchRequest predicate with dates within the last 24 hours?过去 24 小时内日期的 NSFetchRequest 谓词?
【发布时间】:2010-11-24 15:34:36
【问题描述】:

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

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

我试过这个:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我认为这应该可行:

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

    更新

    您可以尝试另一种方法来使实时谓词起作用。我认为您必须更新用于谓词的实体的属性以触发过滤,因此即使您提出的谓词是可能的,您仍然必须遍历所有项目并伪造@987654322 的更新@。

    您可以尝试将布尔属性shouldDisplay 添加到RSSItem 和方法`updateShouldDisplay'

    - (void)updateShouldDisplay {
        self.shouldDisplay = [NSNumber numberWithBool:[self.publicationDate compare:[NSDate dateWithTimeIntervalSinceNow:-86400]] == NSOrderedDescending];
    }
    

    然后,每当您刷新 RSS 提要时,您就会遍历所有实体并调用 updateShouldDisplay。您可能还需要从awakeFromFetch 致电updateShouldDisplay

    为了完整起见,谓词看起来像:

    [NSPredicate predicateWithFormat:@"shouldDisplay == YES"]
    

    我对此不是 100%,但我认为您不能在 NSPredicate 中使用瞬态属性,这意味着您必须存储 shouldDisplay

    【讨论】:

    • 我应该更新我的问题,我想要一个实时查询,随着时间的推移更新结果集。我很遗憾错过了这条非常重要的信息。
    【解决方案2】:
    • 相对日期不是问题。您不需要更改谓词。 “过去 24 小时”边界是相对于当前时间的固定时间点。创建一个NSDate 并将其粘贴在谓词中(如上面罗伯特的回答)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 2020-12-24
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 2011-12-26
      相关资源
      最近更新 更多