目前我得到了这种类型的所有实体,并通过 for-each 循环搜索最大值。
我使用NSFetchRequest
withNSPredicate
作为参数。
是否可以仅通过一个核心数据请求找到该实体?据我了解,此请求应包含对日期和日期比较的转换。
目前我得到了这种类型的所有实体,并通过 for-each 循环搜索最大值。
我使用NSFetchRequest
withNSPredicate
作为参数。
是否可以仅通过一个核心数据请求找到该实体?据我了解,此请求应包含对日期和日期比较的转换。
是的,你可以,但你需要一个技巧。
如果字符串格式类似于 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
}