构建谓词产生语法错误
Building Predicate Producing Syntax Error
我正在构建一个复杂的 NSPredicate,它根据许多变量而变化。似乎最有效的方法是将每个子句分别构建为一个字符串,将这些字符串组合成一个数组,将数组转换回字符串并使用 predicateWithFormat 将其读入谓词。它工作得很好,除了在我比较日期的情况下,我得到以下错误:
Unable to parse the format string "(canceled != 1)&&(starttime >=2016-12-18 13:50:41 +0000)"'
这是我构建此子句的行。
typePredClause = [NSString stringWithFormat:@"(starttime >=%@)",nowstr];
starttime
是实体中的 NSDate
,这就是我得到 nowstr
的方式
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *nowstr = [dateFormatter stringFromDate:[NSDate date]];
我知道只使用 predicateWithFormat
并将字符串排除在外是最理想的,但是谓词太复杂了,构建它是唯一的方法。
谁能建议如何解决这个问题?
作为参考,这是我组合所有子句的代码。
if (typePredClause.length > 0)
[predArr addObject:typePredClause];
NSString *predStr = [predArr componentsJoinedByString:@"&&"];
predicate = [NSPredicate predicateWithFormat:predStr];
如果 starttime
是 NSDate
属性,则不应从日期创建字符串。只需使用 NSDate
.
而且您创建谓词的方法完全错误。不要使用一堆字符串来构建它。这样做:
NSPrediate *canceledClause = [NSPredicate predicateWithFormat:@"canceled != %d", someInt];
NSPredicate *startTimeClause = [NSPredicate predicateWithFormat:@"(starttime >= %@)", [NSDate date]];
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[ canceledClause, startTimeClause ]];
我正在构建一个复杂的 NSPredicate,它根据许多变量而变化。似乎最有效的方法是将每个子句分别构建为一个字符串,将这些字符串组合成一个数组,将数组转换回字符串并使用 predicateWithFormat 将其读入谓词。它工作得很好,除了在我比较日期的情况下,我得到以下错误:
Unable to parse the format string "(canceled != 1)&&(starttime >=2016-12-18 13:50:41 +0000)"'
这是我构建此子句的行。
typePredClause = [NSString stringWithFormat:@"(starttime >=%@)",nowstr];
starttime
是实体中的 NSDate
,这就是我得到 nowstr
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *nowstr = [dateFormatter stringFromDate:[NSDate date]];
我知道只使用 predicateWithFormat
并将字符串排除在外是最理想的,但是谓词太复杂了,构建它是唯一的方法。
谁能建议如何解决这个问题?
作为参考,这是我组合所有子句的代码。
if (typePredClause.length > 0)
[predArr addObject:typePredClause];
NSString *predStr = [predArr componentsJoinedByString:@"&&"];
predicate = [NSPredicate predicateWithFormat:predStr];
如果 starttime
是 NSDate
属性,则不应从日期创建字符串。只需使用 NSDate
.
而且您创建谓词的方法完全错误。不要使用一堆字符串来构建它。这样做:
NSPrediate *canceledClause = [NSPredicate predicateWithFormat:@"canceled != %d", someInt];
NSPredicate *startTimeClause = [NSPredicate predicateWithFormat:@"(starttime >= %@)", [NSDate date]];
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[ canceledClause, startTimeClause ]];