使用 NSPredicate 按日期过滤 coredata 不返回任何内容
Posted
技术标签:
【中文标题】使用 NSPredicate 按日期过滤 coredata 不返回任何内容【英文标题】:coredata filtering by date using NSPredicate returns nothing 【发布时间】:2013-05-03 00:15:30 【问题描述】:嗨,我是这个 coredata 的新手。我有两个实体 CategoryList 和 ExpenseList。 CategoryList 由两个属性组成 1.dates (nsdate) 2.categories (nsstring) 在与 ExpenseList 的许多关系中,关系名称是“expenseList” 费用清单包括 1.amountSpent(浮动)。 我只是想了解 coredata 中的关系特征。当我尝试创建一个 nspredicate 以按特定日期过滤数据时,它什么也不返回。我只是想过滤 CategoryList 实体中特定日期的类别属性内容。这是我的代码
-(void) callingByDate
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSEntityDescription *categoryL = [NSEntityDescription entityForName:@"CategoryList" inManagedObjectContext:managedObjectContext];
NSSortDescriptor *dateSort = [[NSSortDescriptor alloc]initWithKey:@"date" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:dateSort, nil];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"dates == %@",date];
NSFetchRequest *dateFetch = [[NSFetchRequest alloc]init];
[dateFetch setSortDescriptors:sortDescriptors];
[dateFetch setEntity:categoryL];
[dateFetch setPredicate:predicate];
NSMutableArray *results = [[managedObjectContext executeFetchRequest:dateFetch error:nil] mutableCopy];
if([results count] > 0)
NSLog(@"results found");
else
NSLog(@"no results found");
当我在 nslog 区域中执行此代码时,它显示“未找到结果”。我不知道为什么。提前致谢
这是我查找一天的结束和开始的代码
-(NSDate *)beginningOfDay:(NSDate *)date;
NSDate *dat = [NSDate date];
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:( NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:dat];
[components setHour:0];
[components setMinute:0];
[components setSecond:0];
return [cal dateFromComponents:components];
-(NSDate *)endOfDay:(NSDate *)date;
NSDate *dat = [NSDate date];
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:( NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:dat];
[components setHour:23];
[components setMinute:59];
[components setSecond:59];
return [cal dateFromComponents:components];
当我 nslog 时,显示的结果是 开始日 -2013-04-30 18:30:00 +0000 endOfDay -2013-05-01 18:29:59 +0000
【问题讨论】:
@user523234 我会试一试。你能找到任何其他错误而不是这个。谢谢回复 你从来没有真正声明过日期。 @sosborn 是的,我做到了。我在 viewDidLoad 中声明了这一点。 “日期”字符串将给出当前设备日期。 获取时的值是您期望的值吗? 您获取的对象是否有确切的日期? 【参考方案1】:date
实际上是一个时间戳,因此使用它执行==
只会返回具有该确切时间戳的项目。
要获取特定日期的所有条目,您需要获取当天开始的 NSDate
(startOfDay
) 和一天结束的 NSDate
(endOfDay
)然后修改谓词以获取这两个值之间的日期:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"dates >= %@ AND dates >= %@", startOfDay, endOfDay];
要计算startOfDay
和endOfDay
,您可以自己手动计算,也可以使用其他一些库来计算,例如https://github.com/erica/NSDate-Extensions。
【讨论】:
非常感谢,当我尝试在 ns 谓词中明确给出日期时,如 2013-05-03 那样,效果很好。但是,当我尝试使用函数查找一天的开始和结束时,问题仍然存在。我已经更新了我的代码以找到一天的开始和结束。感谢期待 我自己在查找一天的开始和结束的功能上找不到任何错误。如果你能请帮帮我。非常感谢 对 Predicate 进行少量修正,以获得 日期之间 将dates >= %@
更改为 dates <= %@
【参考方案2】:
我使用这个解决方案只比较没有时间的日期,在这种情况下我的日期格式是 yyyy-MM-dd:
NSDateFormatter * formatter = [NSDateFormatter new];
[formatter setDateFormat:@"yyyy-MM-dd"];
NSString * dateString = [formatter stringFromDate:[NSDate date];
NSDate *rdate = [formatter dateFromString:dateString];
NSPredicate *datePre = [NSPredicate predicateWithFormat:@"date = %@", rdate];
您可以同时使用日期和时间来更改日期格式。
【讨论】:
以上是关于使用 NSPredicate 按日期过滤 coredata 不返回任何内容的主要内容,如果未能解决你的问题,请参考以下文章
Core Data NSPredicate 按数组中的项目过滤项目集
如何通过 NSPredicate 过滤 Core Data 托管对象?
iPhone如何使用NSPredicate按父实体过滤Core Data?