使用NSPredicate按日期过滤的coredata不返回任何内容

时间:2013-05-03 00:15:31

标签: ios core-data

嗨,我是这个coredata的新手。我有两个实体CategoryList和ExpenseList。 CategoryList包含两个属性
1.dates(nsdate)
2.categories(nsstring)
与ExpenseList有很多关系,关系名称为“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时,结果显示为 startday -2013-04-30 18:30:00 +0000 endOfDay -2013-05-01 18:29:59 +0000

2 个答案:

答案 0 :(得分:9)

date实际上是一个时间戳,因此使用它进行==只会返回具有该确切时间戳的项目。

要获取特定日期的所有条目,您需要获得当天开始时的NSDatestartOfDay),以及NSDate的结尾日期day(endOfDay)然后使用以下命令修改谓词以获取这两个值之间的日期:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"dates >= %@ AND dates >= %@", startOfDay, endOfDay];

要计算startOfDayendOfDay,您可以手动自己动手,也可以使用其他一些库来计算https://github.com/erica/NSDate-Extensions

答案 1 :(得分:0)

我使用此解决方案仅比较日期而没有时间在这种情况下我的日期格式是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];

您可以使用日期和时间来更改日期格式。