2010-06-21 48 views
0

我有一些XML数据从Web服务检索到,我用它来创建NSManagedObject并存储在sqlite3后备存储中。在我的应用程序中,我使用NSPredicate对象按日期查询此数据(以及其他字段)。我从2009年4月到2010年8月每天都会记录这些数据(根据从SOAP Web服务检索到的原始XML)。在NSPredicate中查询日期看起来不正确:无法匹配未来日期

这里有一个小设置:

NSCalendar *cal = [NSCalendar currentCalendar]; 

NSDate *today = [cal dateFromComponents:[cal components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit 
               fromDate:[NSDate date]]]; 
NSDate *day1ahead = [cal dateFromComponents:[cal components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit 
                fromDate:[NSDate dateWithTimeIntervalSinceNow:kSecondsPerDay]]]; 
NSDate *day2ahead = [cal dateFromComponents:[cal components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit 
                fromDate:[NSDate dateWithTimeIntervalSinceNOw:kSecondsPerDay*2]]]; 

我能够成功地使用NSPredicate这样的查询检索NSManagedObject S:

NSPredicate *todaysData = [NSPredicate predicateWithFormat:@"(StartDate >= %@) AND (StartDate <= %@)", today, day1ahead]; 

然而,当我喜欢的下一个查询,我得到bupkis。

NSPredicate *tomorrowsData = [NSPredicate predicateWithFormat:@"(StartDate >= %@) AND (StartDate <= %@)", day1ahead, day2ahead]; 

我查了XML数据,并为这我想查询是否有将来的日期,我也直接检查了sqlite3的后备存储这样的:

sqlite> select datetime(startdate, "unixepoch", "31 years") from mydatatable; 

结果这个简单的查询表明我未来的日期在那里。

我甚至尝试这样的查询:

NSPredicate *allFuture = [NSPredicate predicateWithFormat:@"(StartDate >= %@)", today]; 

结果不包括任何超出当前日期。它似乎在后备存储中,所以我对NSPredicate对象为什么没有按照我期望的方式工作感到有点不知所措。

有没有办法看到CoreData生成的实际SQL语句,所以我可以真正看到发生了什么?我在sqlite3数据库中查看错误的数据吗?还有什么明显的我失踪了吗?

回答

1

有没有办法看到CoreData生成的实际SQL语句,以便我可以看到真正发生了什么?

是的。在Xcode的Active Executable设置中,将-com.apple.CoreData.SQLDebug 1添加到“要在启动时传递的参数”列表中,并选中复选标记。核心数据然后将NSLog的SQL查询。

+1

谢谢!实际上我发现问题在于我没有在阵列中加载正确的数据,而我正在运行查询。我打算删除这个问题,但这是一个很好的答案。 – 2010-06-21 07:43:39