使用NSPredicate按date过滤coredata不会返回任何内容
嗨,我是新的这种coredata。 我有两个实体CategoryList和ExpenseList。 CategoryList由两个属性组成
1.dates(nsdate)
2.categories(nsstring)
并且与ExpenseList中的许多关系,关系名称是“expenseList”,ExpenseList由1.amountSpent(float)组成。
我只想知道关于coredata的关系特征。 当我试图创build一个nspredicate过滤数据的特定date,它什么都没有返回。 我只想过滤CategoryList实体中的categories属性内容以获得特定的date。 这是我的代码
-(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区域执行此代码时,显示“找不到结果”。 我无法弄清楚为什么。 提前致谢
这里是我的代码来find一天的结束和开始
-(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,结果显示是开始date-2013-04-30 18:30:00 +0000 endOfDay2013-05-01 18:29:59 +0000
date
实际上是一个时间戳,所以这样做==
只会返回具有该确切时间戳的项目。
要获取特定date的所有条目,您需要在一天的开始( startOfDay
)和NSDate
( endOfDay
)之间获取NSDate
,然后修改谓词以获取这两个值之间的date使用:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"dates >= %@ AND dates >= %@", startOfDay, endOfDay];
要计算startOfDay
和endOfDay
您可以自己手动执行,也可以使用其他一些库来计算它,例如https://github.com/erica/NSDate-Extensions 。
我使用这个解决scheme比较只有date没有时间在这种情况下,我的date格式是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];
您可以使用date和时间来更改date格式。