代码之家  ›  专栏  ›  技术社区  ›  Ben Collins

在nspredicate中查询日期似乎不正确:无法匹配将来的日期

  •  0
  • Ben Collins  · 技术社区  · 14 年前

    我从我用来创建的Web服务中检索到一些XML数据 NSManagedObject 并存储在sqlite3备份存储中。In my app, I'm using NSPredicate 对象按日期(连同其他字段)查询此数据。从2009年4月到2010年8月,我所拥有的数据每天都有记录(根据我从SOAP Web服务检索到的原始XML)。

    下面是一个小设置:

    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]]];
    

    我能成功找回 被管理对象 使用一个 NSPRD 这样的查询:

    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 回复  |  直到 14 年前
        1
  •  1
  •   Ole Begemann    14 年前

    有没有一种方法可以看到由coredata生成的实际SQL语句,这样我就可以真正了解到底发生了什么?

    对。在Xcode中的活动可执行文件设置中,添加 -com.apple.CoreData.SQLDebug 1 到“要在启动时传递的参数”列表并选中复选标记。然后,核心数据将nslog其SQL查询。