0

検索フィールドがあり、テキストは以下を使用してCoreDataに対して起動されます。

produkt.name CONTAINS[cd] %@

'しかし、ユーザーが入力すると、'文字が私のクエリを台無しにするため、これはクラッシュします。

キャッチされなかった例外のためにアプリを終了しますNSInvalidArgumentException
理由:フォーマット文字列produkt.nameCONTAINS[cd]を解析できません。

CoreDataにそれを処理するオプションはありませんか?一人で逃げないといけないなんて想像もできませんか?

4

4 に答える 4

2

文字の置換は一切必要ありません。私はあなたがこのようにあなたの述語を作成していると推測しています:

NSString *s = [NSString stringWithFormat:@"produkt.name CONTAINS[cd] '%@'", term];
NSPredicate *p = [NSPredicate predicateWithFormat:s];

それは正しくないでしょう。あなたがする必要があるのはこれだけです:

NSPredicate *p = [NSPredicate predicateWithFormat:@"produkt.name CONTAINS[cd] %@", term];

これは、検索語の単一引用符などに関係なく機能します。

于 2012-12-07T04:51:15.037 に答える
0

その文字列を次のような'文字列に置き換えることができます''

string = [string stringByReplacingOccurrencesOfString:@"'" withString:@"''"];
于 2012-12-06T10:37:44.817 に答える
0

私は、それはそれの世話をするだろうと思います。

以下は私が試したもので、検索ボックスに文字列としてOh'gd"を渡しました。

- (void) stringWithPredicateText : (NSString *)predicateText {

    if ([predicateText length] >0) {
        NSLog(@"predicateText = (%@)",predicateText);
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"location contains[cd] %@",predicateText];
        NSLog(@"Predicate = <%@>",predicate);
    }   

}

出力:

Test [52856:707] predicateText =(Oh'gd ")

Test [52856:707]述語=(location CONTAINS [cd] "Oh'gd \" ")

ここでは、述語テキストと述語が正しく形成されており、すでに'と"の文字が処理されており、アプリがクラッシュしないことがわかります。

于 2012-12-06T13:18:38.377 に答える
-1

文字を検索する必要がない場合は'、テキストフィールドデリゲートコールバックの検索フィールドから文字を除外するだけです。

- (BOOL)textField:(UITextField *)textField 
     shouldChangeCharactersInRange:(NSRange)range 
     replacementString:(NSString *)string {

   if ([string isEqualToString:@"'"]) return NO;
   return YES;
}

述語を作成するときに、問題のある文字を直接削除することもできます。

[NSPredicate predicateWithFormat:@"produkt.name CONTAINS[cd] %@",
  [searchString stringByReplacingOccurrencesOfString:@"'" withString:@""]];
于 2012-12-06T10:35:30.267 に答える