【问题标题】:NSPredicate: "Unable to parse the format string '%@'"?NSPredicate:“无法解析格式字符串 '%@'”?
【发布时间】:2012-04-17 20:57:10
【问题描述】:

我正在尝试构建查询字符串或谓词,但我不断收到此错误,

基本上我无法理解的是这很好用:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name contains[cd] 'o')"];

但是这个:

NSString *predString =  @"(name contains[cd] 'o')";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"%@", predString]; 

抛出这个:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "%@"'

【问题讨论】:

    标签: objective-c ios core-data nspredicate predicate


    【解决方案1】:

    %@ 不是谓词格式,它是字符串格式。

    NSPredicate *pred = [NSPredicate predicateWithFormat:predString];
    

    【讨论】:

    • 这不是问题的正确解决方案。如果predString 包含用户提供的数据(例如,account == "user%K%@<bindata>"user%K%@<bindata> 是攻击者提供的数据),它会向您的代码开放各种格式字符串注入攻击。在任何 ...withFormat: 方法中,您永远不应该使用除常量字符串之外的任何内容。
    【解决方案2】:

    正如所指出的,%@ 不能在谓词构造中到处使用。但是能够提前构造谓词会很有用。您可以使用#define 来定义它的全部或至少是它的常量部分:

        #define kPredicateStr_MovieItem_MoviesInCatalog @"((wishList == NO) AND ((tvEpisode == NO) || (tvEpisode == YES AND (ANY tvSeries.genres.name LIKE 'TV Movie'))))"
    

    然后按原样提供:

        itemsViewController.predicate = [NSPredicate predicateWithFormat:kPredicateStr_MovieItem_MoviesInCatalog];
    

    或添加到它:

        NSString *predStr = [NSString stringWithFormat:@"%@ AND (%@ CONTAINS \"%@\")", kPredicateStr_MovieItem_MoviesInCatalog, titleForSearch, searchString];
    
        predicate = [NSPredicate predicateWithFormat:predStr];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多