2013-01-02 24 views
6

Ora sto affrontando problemi con quote singole (') in NSPredicate.NSPredicate Quote singole Numero

ecco la mia domanda:

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

quando ho filtro con il nome, "John", è ok e nessun errore a tutti. Ma io uso il nome "Mary" Monny ". c'è un errore.

ho il sospetto che sia a causa di un preventivo singolo. pls aiutami come superare questo problema.

Grazie

risposta

1

Se name = @ "di Bell", si può provare a fare predicato in questo modo:

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

Basta sostituire le virgolette singole standard con doppi apici.

+3

E se la stringa di input ha virgolette doppie, allora cosa? – northernman

12

come una soluzione rapida, non dovrebbe essere necessario la parte NSString a tutti. Questa sostituzione è l'intero punto del metodo predicateWithFormat:! Semplicemente utilizzare:

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

Mi piace evitare completamente le stringhe di formato e creare invece il predicato nel codice.

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

Nota che ho aggiunto NSCaseInsensitivePredicateOption|NSDiacriticInsensitivePredicateOption per fare un caso-e confronto diacritic insensibile sul nome, come in s_name like[cd] %@. Se non ne hai bisogno, puoi ovviamente usare type:NSEqualToPredicateOperatorType e options:0.

+0

La "soluzione rapida" è la risposta corretta. –

+0

Questo dovrebbe essere contrassegnato come la risposta corretta. – northernman