【问题标题】:NSFetchRequest fails when using date as predicate使用日期作为谓词时 NSFetchRequest 失败
【发布时间】:2017-06-26 03:45:54
【问题描述】:

我正在尝试从“今天”创建的核心数据实体中获取所有记录,我在实体中有一个名为 createdDate 的字段,它使用设备的本地时区以以下格式将日期存储为字符串

2017-06-26T11:06:43+08:00

我创建以下日期字符串进行比较:

NSDateFormatter *dateFormatterDayOnly = [[NSDateFormatter alloc] init];
    [dateFormatterDayOnly setDateFormat:@"yyyy-MM-dd"];
    [dateFormatterDayOnly setTimeZone:[NSTimeZone localTimeZone]];

    NSString *todaysDate = [dateFormatterDayOnly stringFromDate:[NSDate date]];

调试告诉我谓词看起来不错,如下所示

2017-06-26 11:33:22.277 NWMobileTill[1842:482539] -[EodView tillTotalCashIn] todaysDate:2017-06-26

然后我按如下方式创建谓词

NSPredicate *predicateTodaysDate = [NSPredicate predicateWithFormat:@"createdDate like[cd] %@", todaysDate];

    fetchPts.predicate = predicateTodaysDate;

    NSArray *todaysTendersArray = [[context executeFetchRequest:fetchPts error:&errorPts] mutableCopy];

但这会返回 0 次点击

我希望这与今天创建的所有内容相匹配。

我需要进行哪些更改才能返回今天创建的所有记录?

【问题讨论】:

  • 是的,正如问题中明确指出的那样,它被存储为字符串
  • 你为什么这样做? “调试”是如何告诉你那个字符串的。
  • 你的问题和我的问题有关吗?
  • 当然,高度。
  • 它有什么关系?如果是,请解释原因

标签: objective-c core-data nspredicate


【解决方案1】:

用BEGINSWITH代替like[cd]

[NSPredicate predicateWithFormat:@"createdDate BEGINSWITH %@", todaysDate];

或正则表达式求值:

NSString* regex = [NSString stringWithFormat:@"^%@.*$", todaysDate];
[NSPredicate predicateWithFormat:@"createdDate MATCHES %@", regex];

【讨论】:

    【解决方案2】:

    将日期对象存储为字符串是错误。这不是一点点错误。这不是'理性的人会不同意错误。这是完全错误的。

    作为一个字符串,你无法比较哪个更大。您无法选择范围。您不能按日期排序。最重要的是,您认为字符串会做得更好的一件事 - 将日期显示为字符串 - 也更难!由于本地化,您必须将字符串解析为日期,然后再解析为正确的本地化字符串。

    如果您尚未发布您的应用,只需更改核心数据模型中的类型,删除该应用,然后重新安装即可。确保其他人也删除该应用程序,否则他们会崩溃。

    如果您已经发布了您的应用程序,则使用 ANOTHER 属性创建一个新模型版本,并将 createdDate 作为日期。当应用程序启动时(但不在应用程序委托中 - 因为它可能需要超过 5 秒,如果确实如此,那么操作系统将强制退出应用程序)通过数据库并解析所有 createdDate 字符串并将它们放入 createdDate 日期字段。

    要在值为 date 时进行搜索,请获取日期的开始和结束,并搜索介于两者之间的值。

    NSDate* startOfDay = [self.calendar startOfDayForDate:[NSDate date]];
    NSDate* endOfDay = [self.calendar dateByAddingUnit:NSCalendarUnitDay value:1 toDate:startOfDay options:0];
    NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[[NSPredicate predicateWithFormat:@"createdDate > %@", startOfDay],[NSPredicate predicateWithFormat:@"createdDate < %@", endOfDay]]];
    

    【讨论】:

    • 我的朋友,我们在模型中已经有不同的日期字段,所以我们能否与问题保持相关,问题不在于将日期存储为字符串是对还是错,
    • 我的朋友,我们在模型中已经有不同的日期字段,所以我们能否与问题保持相关,问题不在于将日期存储为字符串是对还是错,
    • 根据日期字段进行搜索。
    • 我们又是这样,但这与这个问题无关
    • 所以要明确一点:你有两个字段。一个叫做createdDate,它是一个字符串,另一个不同的字段也代表createdDate,但它是一个日期。并且两者都设置正确。当您根据日期进行搜索时,它可以正常工作,但是当您根据字符串进行搜索时,它就不起作用了。由于您无法解释的原因,必须根据字符串进行搜索。对吗?
    猜你喜欢
    • 1970-01-01
    • 2020-04-23
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多