Ios 核心数据。使用max“获取实体”;日期时间“;哪个写为字符串?

Ios 核心数据。使用max“获取实体”;日期时间“;哪个写为字符串?,ios,datetime,core-data,comparison,type-conversion,Ios,Datetime,Core Data,Comparison,Type Conversion,目前,我得到了这种类型的所有实体,并通过每个循环搜索最大值 我使用NSFetchRequest和NSPredicate作为参数 是否可以仅通过一个核心数据请求找到该实体?据我所知,此请求应包含日期和日期比较的转换。是的,您可以,但您需要一些技巧 如果字符串格式类似于yyyy/MM/dd HH:MM:ss,则可以使用排序描述符轻松地完成此操作。由于您使用的是MM/dd/yyyy格式,这将不起作用,因为它将先按月份排序 但是,您可以在托管对象上创建一个类别,该类别添加一个NSDate属性,该属性可将

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

我使用
NSFetchRequest
NSPredicate
作为参数


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

是的,您可以,但您需要一些技巧

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

但是,您可以在托管对象上创建一个类别,该类别添加一个NSDate属性,该属性可将字符串日期动态转换为实际日期。在排序描述符中,您可以使用此类别字段,按降序排序并选择第一个结果。
编辑:NSSORTDescriptor不能与瞬态属性一起使用,因此这不是一个选项。(另见下文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
}
-(NSManagedObject*)findObjectMostRecentDate{
//设置排序描述符以将最后日期设置为第一个结果
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:[[NSSortDescriptor alloc]initWithKey:@“realDateTime”升序:否]];
//执行提取请求
NSArray*results=[managedObjectContext executeFetchRequest:fetchRequest错误:nil];
if(results.count){

返回[results firstObject];//是的,您可以,但是您需要在某个地方使用技巧

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

但是,您可以在托管对象上创建一个类别,该类别添加一个NSDate属性,该属性可将字符串日期动态转换为实际日期。然后,在排序描述符中,您可以使用此类别字段,按降序排序并选择第一个结果。
编辑:NSSORTDescriptor不能与瞬态属性一起使用,因此这不是一个选项(另请参见下面的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
}
-(NSManagedObject*)findObjectMostRecentDate{
//设置排序描述符以将最后日期设置为第一个结果
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:[[NSSortDescriptor alloc]initWithKey:@“realDateTime”升序:否]];
//执行提取请求
NSArray*results=[managedObjectContext executeFetchRequest:fetchRequest错误:nil];
if(results.count){

return[results firstObject];//那么您的日期存储为字符串?(为什么?)使用什么格式?您当前的代码是什么样子?使用的近似格式是:“MM/dd/yyyyy H:MM:ss”(所有数据组件都是数字)。是的,核心数据将其存储为“字符串”。为什么?此应用程序是跨平台的,最好尽可能少地更改表/实体的关系。但您至少知道如何比较datetime对象吗?我强烈认为您不能直接在获取请求中进行比较,因为核心数据获取请求的排序描述符非常有限。-如果格式是“yyyy/MM/dd HH:MM:ss”然后一个简单的字符串比较就可以了。那么您的日期存储为字符串?(为什么?)使用什么格式?您当前的代码是什么样子?使用的近似格式是:“MM/dd/yyyyy H:MM:ss”(所有数据组件都是数字)。是的,核心数据将其存储为“字符串”“。为什么?此应用程序是跨平台的,最好尽可能少地更改表“/实体”关系。但您至少知道如何比较datetime对象吗?我强烈认为您不能直接在获取请求中进行比较,因为核心数据获取请求的排序描述符非常有限。-如果“yyyy/MM/dd HH:MM:ss"然后,一个简单的字符串比较就可以了。核心数据排序描述符只能使用持久属性,不能使用瞬时属性,也不能使用Objective-C方法。因此,您的第一个建议不起作用。啊,谢谢您的更正。我很确定我过去做过这件事,但您似乎是对的,所以我一定是错了;)。我会编辑我的答案。无论如何,添加第二个dateTime字段比替换现有字段要好。如果我这样做,那么如何比较dateTime格式?我已经在我的答案中添加了一些示例代码。您不需要显式的dateTime比较,因为这将由排序操作完成。核心数据排序描述符只能使用持久属性,而不需要转换ent属性和无Objective-C方法。因此,您的第一个建议不起作用。啊,谢谢您的更正。我很确定我以前也这么做过,但似乎您是对的,所以我一定是错了;)。我将编辑我的答案。无论如何,添加第二个dateTime字段比替换现有字段要好。如果我这样做,怎么办o比较日期时间格式?我在答案中添加了一些示例代码。您不需要