我正在尝试从“今天”创建的核心数据实体中获取所有记录,我在Entity中有一个名为createdDate的字段,该字段使用以下格式的设备的本地timeZone将日期存储为字符串
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]];
调试告诉我Predicate看起来没问题如下
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次点击
我原本预计这会匹配今天创建的所有内容。
我需要更改什么才能返回今天创建的所有记录?
答案 0 :(得分:2)
而不是like[cd]
使用BEGINSWITH
[NSPredicate predicateWithFormat:@"createdDate BEGINSWITH %@", todaysDate];
或正则表达式评估:
NSString* regex = [NSString stringWithFormat:@"^%@.*$", todaysDate];
[NSPredicate predicateWithFormat:@"createdDate MATCHES %@", regex];
答案 1 :(得分:0)
将日期对象存储为字符串错误。这不是一个小错误。不合理的是人们不同意错误。这是完全错误的。
作为一个字符串,你无法比较哪个更大。您无法选择范围。您无法按日期排序。除此之外,您认为字符串会做得更好的一件事 - 将日期显示为字符串 - 也更难!由于本地化,您必须将字符串解析为日期,然后再将其解析为正确的本地化字符串。
如果您还没有发布应用程序,只需更改核心数据模型中的类型,删除应用程序,然后重新安装。确保其他人也删除了应用程序,否则它们会崩溃。
如果您已经发布了应用程序,则创建一个带有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]]];