【问题标题】:Filter core data objects by time按时间过滤核心数据对象
【发布时间】:2016-01-19 19:28:04
【问题描述】:

您好,我正在尝试仅过滤属于特定时间的对象。例如,我只想要上午 8 点之前或下午 1 点之后的对象。

如果在我的对象中有一个 createdDate 属性,并且我只想获取在上午 8 点之前创建的对象,那么有什么方法可以做到这一点?

我想通过使用这两种方法中的任何一种来做到这一点,但尝试这两种方法都得到了 0 个结果。

1.创建了一个单独的派生属性,该属性返回时间部分并对其进行过滤。

即(Persistent)createdDate -> (Derived)createdTimeByHour

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"createdTimeByHour < 10"];

2.设置谓词根据转换后的 createdDate 进行过滤。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"createdDate.hour < 10"];   

尝试:

我尝试实施第一个解决方案,但 NSFetchRequest 没有返回给我任何结果。我像这样创建派生属性...

- (NSNumber *)createdTimeByHour
{

    NSNumber *result;
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:[self createdDate]];
    result = @([components hour]);

    return result;
}

背景问题 我发现我得到了 0 个结果,因为我在 Core Data 中已经存在对象之后添加了派生数据。这些对象在核心数据中没有值,但是当在获取所有结果后尝试为它记录时,它会创建派生结果,但不会在核心数据中保存或存储数据。我希望我不需要将其存储在 Core Data 中,但最后,这样做是有意义的,因为我将经常通过该字段进行查询。

简单的解决方案 因此,在一个非常简单的情况下,要按时间过滤,您必须创建一个属性,将该值存储在核心数据中。据我所知,您不能直接从 NSDate 按时间过滤。

高级解决方案 如果在核心数据中已经存在对象的情况下添加该字段,则必须对核心数据中的每个对象进行处理以存储此结果。

【问题讨论】:

    标签: objective-c core-data nspredicate nsfetchrequest


    【解决方案1】:

    我认为 Core Data 最简单的方法是使用解决方案 1,这是一个派生属性来返回一天中的小时。你也可以坚持它(你需要这样做才能在NSFetchedResultsController中使用它);您可以在设置createdDate 时自动执行此操作(例如在awakeFromInsert 中)。

    例如

    -(void) awakeFromInsert {
       [super awakeFromInsert];
       self.createdDate = [NSDate date];
       NSCalendar *calendar = [NSCalendar currentCalendar];
       NSDateComponents *comps = 
          [calendar components:NSCalendarUnitHour fromDate: [NSDate date]];
       self.hour = @(comps.hour);
    }
    

    【讨论】:

    • 感谢世界的回复。我遇到的问题是使用 NSFetchRequest 时,它不返回任何值。我编辑了上面的问题以显示我如何创建派生属性
    • 这是一个不同的问题,与您的数据或您如何填充数据字段有关。
    • 抱歉 mundi 造成混淆。我编辑了上面的问题以显示我是如何创建派生属性的。这样做并尝试第一个解决方案时,它返回 0 个结果。这让我相信您不能根据派生属性进行过滤。
    • 您是否按照我的原始(也已修改)答案中的建议坚持了它们?
    • 尝试获取所有记录并记录日期和派生属性,然后看看是否应该得到任何结果。
    猜你喜欢
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多