我有一个名为RSSItem
的核心数据实体,其日期属性名为publicationDate
。
有没有办法为NSFetchRequest
创建一个谓词,其中包含过去24小时内发布日期的所有实体?
我试过这个:
NSString* expression = @"publicationDate.timeIntervalSinceNow >= -86400";
return [NSPredicate predicateWithFormat:expression];
但是这会产生一个nil
谓词,从而匹配所有内容。
我希望有一个随时间变化的实时谓词。因此,具有NSDate
实例的谓词是不可能的,因为它定义了不可变的单个时间点,而不是相对时间,例如过去24小时。
答案 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
。