2012-04-17 25 views
2

私は理解できないものを基本的に私は、クエリ文字列や述語を構築しようとしているが、私はこのエラーを得続ける、NSPredicate: "フォーマット文字列 '%@'を解析できません。

が、これは正常に動作していることである:

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 "%@"'

答えて

12

%@は、述語形式ではなく、文字列形式です。

NSPredicate *pred = [NSPredicate predicateWithFormat:predString]; 
+0

ええ、フォーマットされた文字列を作成し、それを –

+0

に渡してください。これは適切な解決策ではありません。 'predString'にユーザ提供のデータが含まれている場合(例えば、' account == "user%K%@" ''%K%@ ''という形式の文字列注入攻撃まで、あなたのコードを開きます。攻撃者提供のデータ)。 '... withFormat:'メソッドのいずれかで定数文字列以外のものを使用するべきではありません。 – user8472

0

指摘したように、%@は述語構築のどこでも使用できません。しかし、事前に述語を構築できると便利です。そのままそれを次に

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

いずれかを供給する:あなたは、すべて、または少なくともそれの一定の部分を定義するために#defineを使用することができます

itemsViewController.predicate = [NSPredicate predicateWithFormat:kPredicateStr_MovieItem_MoviesInCatalog]; 

またはそれに追加します。

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

    predicate = [NSPredicate predicateWithFormat:predStr]; 
関連する問題