代码之家  ›  专栏  ›  技术社区  ›  PeyloW

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

  •  4
  • PeyloW  · 技术社区  · 15 年前

    我有一个名为 RSSItem 具有名为 publicationDate .

    是否有方法为 NSFetchRequest 这将包括所有在过去24小时内有出版日期的实体?

    我试过这个:

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

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

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

    2 回复  |  直到 15 年前
        1
  •  0
  •   karwag    14 年前
    • 相对日期不是问题。您不需要更改谓词。“最后24小时”边界是相对于当前时间的固定时间点。创建 NSDate 把它放在谓词中(就像上面罗伯特的回答)

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

        2
  •  4
  •   Robert Höglund    15 年前

    我认为这应该管用:

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

    更新

    您可以尝试另一种方法来让live谓词工作。我认为您必须更新谓词中用于触发筛选的实体的属性,因此即使您建议的谓词是可能的,您仍然必须遍历所有项并为 publicationDate .

    您可以尝试添加bool属性 shouldDisplay RSSItem 还有一个方法“updateShouldDisplay”

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

    然后每当您刷新RSS提要时,就循环遍历所有实体并调用 updateShouldDisplay . 你可能得打电话 更新soulddisplay awakeFromFetch 也。

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

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

    我不是百分之百的,但是我认为你不能在NSPredicate中使用瞬态属性,这意味着你必须存储 应显示 .