【发布时间】:2014-11-19 12:41:14
【问题描述】:
我正在尝试使用NSDates 创建一个NSPredicate 来查询我的核心数据数据库。我正在以一种将名为filterString 的NSMutableString 拼凑在一起的方法形成谓词。 queryCount 是一个 NSInteger,用于跟踪附加了多少查询。在下面的块中,start 和 end 是 NSDates
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 使用日期的正确格式还是有其他方法?我在网上找到的所有内容都让我认为我只是将 NSDate 对象放入格式化的字符串中,就像我正在做的那样。
【问题讨论】:
-
您可以尝试的一件事是创建多个单独的谓词并设置一个复合谓词:[NSCompoundPredicate andPredicateWithSubpredicates:@[pred1, pred2]];
标签: ios objective-c nsdate nspredicate