6

現在、NSPredicateで一重引用符(')の問題に直面しています。

これが私の質問です:

 NSPredicate *query = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"s_name='%@' AND s_regno=%d",Name,[RegNo intValue]]];

「John」という名前でフィルタリングすると、問題はなく、エラーはまったく発生しません。しかし、私は「メアリー'モニー」という名前を使用します。エラーがあります。

一重引用符が原因だと思います。plsはこの問題を克服する方法を教えてくれます。

ありがとう

4

2 に答える 2

14

NSString簡単な修正として、パーツはまったく必要ありません。この置換がメソッドの要点predicateWithFormat:です!単に使用してください:

NSPredicate *query = [NSPredicate predicateWithFormat:@"s_name == %@ AND s_regno == %d", Name, [RegNo intValue]];

フォーマット文字列を完全に避け、代わりにコードで述語を作成するのが好きです。

NSPredicate *nameQuery =
[NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"s_name"]
                                   rightExpression:[NSExpression expressionForConstantValue:Name]
                                          modifier:NSDirectPredicateModifier
                                              type:NSLikePredicateOperatorType
                                           options:NSCaseInsensitivePredicateOption|NSDiacriticInsensitivePredicateOption];

NSPredicate *regNoQuery =
[NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"s_regno"]
                                   rightExpression:[NSExpression expressionForConstantValue:RegNo]
                                          modifier:NSDirectPredicateModifier
                                              type:NSEqualToPredicateOperatorType
                                           options:0];

NSPredicate *query = [NSCompoundPredicate andPredicateWithSubpredicates:@[nameQuery,regNoQuery]];

NSCaseInsensitivePredicateOption|NSDiacriticInsensitivePredicateOptionのように、名前に対して大文字と小文字および発音区別符号に依存しない比較を行うために追加したことに注意してくださいs_name like[cd] %@。それが必要ない場合は、もちろんtype:NSEqualToPredicateOperatorTypeとを使用できますoptions:0

于 2013-01-02T02:40:28.273 に答える
1

name = @ "Bell's"の場合、次のように述語を作成することができます。

NSPredicate *query = [NSPredicate predicateWithFormat:@"name == \"%@\"", name];  

標準の一重引用符を二重引用符に置き換えるだけです。

于 2013-11-21T15:18:01.773 に答える