2013-01-02 12 views
6

Jetzt bin ich Single-Quote (') Probleme in NSPredate konfrontiert.NSPredicate Single Quote Ausgabe

hier ist meine Frage:

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

, wenn ich mit dem Namen filtern, „John“, es ist in Ordnung und kein Fehler überhaupt. Aber ich benutze den Namen "Mary 'Monny". es gibt einen Fehler.

ich vermute, dass es wegen des einfachen Anführungsstrichs ist. Bitte helfen Sie mir, dieses Problem zu überwinden.

Dank

Antwort

1

Wenn name = @ "Bell", können Sie versuchen, Prädikat wie dies zu machen:

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

Ersetzen Sie einfach Standard einfache Anführungszeichen mit doppelten Anführungszeichen.

+3

Und wenn Ihre Eingabezeichenfolge doppelte Anführungszeichen hat, was dann? – northernman

12

Als schnelle Lösung, sollten Sie den NSString Teil überhaupt nicht brauchen. Diese Substitution ist der springende Punkt der predicateWithFormat: Methode! Einfach verwenden:

Ich mag die Formatzeichenfolgen vollständig vermeiden und stattdessen das Prädikat im Code erstellen.

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]]; 

Bitte beachte, dass ich NSCaseInsensitivePredicateOption|NSDiacriticInsensitivePredicateOption eine Fall- und diakritische unempfindlichen Vergleich auf den Namen, wie in s_name like[cd] %@ zu tun gegeben. Wenn Sie das nicht benötigen, können Sie natürlich type:NSEqualToPredicateOperatorType und options:0 verwenden.

+0

Ihre "schnelle Lösung" ist die richtige Antwort. –

+0

Dies sollte als die richtige Antwort markiert werden. – northernman