【问题标题】:Building Predicate Producing Syntax Error构建谓词产生语法错误
【发布时间】:2017-05-03 17:21:12
【问题描述】:

我正在构建一个复杂的 NSPredicate,它取决于许多变量。似乎效果最好的方法是将每个子句单独构建为一个字符串,将字符串组合成一个数组,将数组转换回一个字符串并使用 predicateWithFormat 将其读入谓词。除了在比较日期并出现以下错误的情况下,它的效果很好:

无法解析格式字符串“(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];

【问题讨论】:

    标签: ios objective-c nsdate nspredicate


    【解决方案1】:

    如果starttime 是某个NSDate 属性,则不应从日期创建字符串。只需使用NSDate。

    而且您创建谓词的方法都是错误的。不要使用一堆字符串来构建它。这样做:

    NSPrediate *canceledClause = [NSPredicate predicateWithFormat:@"canceled != %d", someInt];
    NSPredicate *startTimeClause = [NSPredicate predicateWithFormat:@"(starttime >= %@)", [NSDate date]];
    NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[ canceledClause, startTimeClause ]];
    

    【讨论】:

    • 我使用复合谓词方法在没有字符串的情况下重新编写了它并解决了问题。谢谢!
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2019-01-19
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多