2014-09-24 56 views
-1

我正在尝试创建一个NSPredicateNSDate s来查询我的核心数据db。我在一个方法中形成一个名为filterStringNSMutableString的谓词。 queryCount是一个NSInteger,用于跟踪追加了多少个查询。在下面的块,startendNSDate小号NSPredicate with NSDate

if (start || end) 
    { 
     if (!queryCount) 
     { 
      [filterString appendString:@"("]; 
     } 
     else 
     { 
      [filterString appendString:@" && ("]; 
     } 

     // date range and exact date 
     if (start && end) 
     { 
      [filterString appendFormat:@"%@ >= %@ && %@ <= %@", kTransactionFilterDateKey, start, kTransactionFilterDateKey, end]; 
     } 
     // only start 
     else if (start && !end) 
     { 
      [filterString appendFormat:@"%@ >= %@ && %@ <= %@", kTransactionFilterDateKey, start, kTransactionFilterDateKey, [NSDate distantFuture]]; 
     } 
     // only end 
     else if (end && !start) 
     { 
      [filterString appendFormat:@"%@ >= %@ && %@ <= %@", kTransactionFilterDateKey, [NSDate distantPast], kTransactionFilterDateKey, end]; 
     } 

     [filterString appendString:@")"]; 

     queryCount++; 
    } 

当我到形成实际谓词对象(self.currentFilterString是指其中上述块是从方法)的块:

​​

我收到错误"Unable to parse the format string "(date >= 2014-09-24 04:00:00 +0000 && date <= 4001-01-01 00:00:00 +0000)""

这是标记为//only start的块的结果。其他块的结果相同。我试过使用不同的日期值而不是distantFuture,但是这也不会改变任何东西。

我也试过了一个变化,就像"%@ BETWEEN %@", kTransactionFilterDateKey, @[start, end],但这给了我同样的错误。

这是一个NSPredicate使用日期的正确格式还是有不同的方法来做到这一点?我在网上找到的所有东西都让我认为我只是将NSDate对象放入格式化的字符串中,就像我在做的一样。

+0

您可以尝试的一件事是创建多个单独的谓词并设置复合谓词:[NSCompoundPredicate andPredicateWithSubpredicates:@ [pred1,pred2]]; – mitrenegade 2014-09-24 21:33:14

回答

1

我想通了。比较日期时,NSPredicate对关键格式很挑剔。当我使用%K作为键来手动创建谓词时,将已格式化的字符串直接放入predicateWithFormat:而不是%@,而我已将其传入该字符串中。所以我重写了我的解决方案,创建一个带有%K作为关键占位符的格式化字符串,并创建了一个我可以传入的参数数组predicateWithFormat:arguments