目前,我获得了此类型的所有实体,并通过for-each循环搜索最大值。
我使用NSFetchRequest
和NSPredicate
作为参数。
是否可以仅通过一个核心数据请求找到此实体?据我了解,此请求应包含转换为日期和日期比较。
答案 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
}