1

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

我使用NSFetchRequestwithNSPredicate作为参数。

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

4

1 回答 1

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
}
于 2013-11-13T16:02:26.307 回答