NSPredicate与NSDate

时间:2014-09-24 21:22:51

标签: ios objective-c nsdate nspredicate

我正在尝试使用NSPredicate创建一个NSDate来查询我的核心数据db。我正在一个方法中形成谓词,该方法将名为NSMutableString的{​​{1}}拼凑在一起。 filterStringqueryCount,用于跟踪追加的查询数量。在下面的块中,NSIntegerstartend s

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

我收到错误- (NSPredicate*)currentPredicate { return [NSPredicate predicateWithFormat: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对象放入格式化的字符串中,就像我正在做的那样。

1 个答案:

答案 0 :(得分:1)

我明白了。在比较日期时,NSPredicate对于密钥格式是挑剔的。当我使用%K为密钥手动创建谓词并将格式化的字符串直接放在predicateWithFormat:而不是%@的已经格式化的字符串中时,它可以正常工作。所以我重新设计了我的解决方案来创建一个格式化的字符串,其中%K作为关键占位符,并创建了一个参数数组,我可以将其传递给predicateWithFormat:arguments