我正在尝试使用NSPredicate
创建一个NSDate
来查询我的核心数据db。我正在一个方法中形成谓词,该方法将名为NSMutableString
的{{1}}拼凑在一起。 filterString
是queryCount
,用于跟踪追加的查询数量。在下面的块中,NSInteger
和start
为end
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
对象放入格式化的字符串中,就像我正在做的那样。
答案 0 :(得分:1)
我明白了。在比较日期时,NSPredicate对于密钥格式是挑剔的。当我使用%K
为密钥手动创建谓词并将格式化的字符串直接放在predicateWithFormat:
而不是%@
的已经格式化的字符串中时,它可以正常工作。所以我重新设计了我的解决方案来创建一个格式化的字符串,其中%K
作为关键占位符,并创建了一个参数数组,我可以将其传递给predicateWithFormat:arguments