核心数据。获取具有max“dateTime”的实体,该实体写为字符串?

时间:2013-11-13 15:20:47

标签: ios datetime core-data comparison type-conversion

目前,我获得了此类型的所有实体,并通过for-each循环搜索最大值。

我使用NSFetchRequestNSPredicate作为参数。

是否可以仅通过一个核心数据请求找到此实体?据我了解,此请求应包含转换为日期和日期比较。

1 个答案:

答案 0 :(得分:1)

是的,你可以,但你需要一个技巧。

如果字符串格式类似于yyyy / MM / dd HH:mm:ss,您可以使用排序描述符轻松完成此操作。由于您使用的格式为MM / dd / yyyy,因此它将无法使用,因为它将首先按月排序。

但是,您可以在托管对象上创建一个类别,该类别添加了一个NSDate属性,该属性可以动态地将字符串日期转换为实际日期。在排序描述符中,您可以使用此类别字段,按降序排序并选择第一个结果。
编辑:NSSortDescriptors不能与瞬态属性一起使用,因此这不是一个选项。 (另见Martin R在下面的评论)。

另一种选择是为您的实体添加一个额外的日期字段,该实体以实际日期格式存储相同的日期。因此,您需要更新当前的数据库模型,但这可能会稍微好一些。

澄清最后一个选项: (假设您添加了一个名为''realDateTime'的日期字段)

存储实体时,您可以添加以下代码:

// String to date conversion
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM/dd/yyyy HH:mm:ss"];
realDateTime = [dateFormatter dateFromString:dateTime];

要查找具有最新日期的实体,您可以实现如下所示的方法:

- (NSManagedObject *)findObjectMostRecentDate {
    // Set a sort descriptor to set last date as first result
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:@"realDateTime" ascending:NO]]];

    // Execute the fetch request
    NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:nil];
    if (results.count) {
        return [results firstObject]; // <-- This returns the object with the 'max' date
    else
        return nil; // No objects fetched
}