2017-09-12 6 views
1

J'ai un UITableView avec un UISearchbar qui m'a laissé filtrer les données basées sur le du UISearchbar.Comment passer le même paramètre plusieurs fois dans le générateur de prédicat CoreData iOS?

Le tableau CoreData contient 3 attributes

name, notes, date 

Je veux rechercher les trois colonnes pour tout événement basé sur le texte de recherche User.

donc j'ai essayé ceci sur:

let searchText = searchText.lowercased() 
let query = "name contains[cd] %@ OR notes contains[cd] %@ OR date contains[cd] %@" 
let predicate = NSPredicate(format: query, searchText, searchText, searchText) 

Est-il possible de passer le même paramètre (searchText) une fois?

Quelque chose comme Java formatter chaîne:

let query = "name contains[cd] %[email protected] OR notes contains[cd] %[email protected] OR date contains[cd] %[email protected]" 
let predicate = NSPredicate(format: query, searchText) 

Répondre

1

Vous pouvez utiliser variables de substitution:

let searchText = searchText.lowercased() 
let template = NSPredicate(format: "name contains[cd] $SRCH OR notes contains[cd] $SRCH OR date contains[cd] $SRCH") 
let subVars = ["SRCH": searchText] 
let predicate = template.withSubstitutionVariables(subVars) 

Voir "Création prédicats utilisant des modèles prédicats" dans le Apple Documentation.

+0

est-il sûr pour «injection sql»? – wajeeh

+0

Je le pense. L'analyse de la chaîne de format est principalement effectuée lors de la création initiale du modèle. Elle est donc soumise aux mêmes vérifications qu'une chaîne de format de prédicat normale. Le processus de substitution inclura des chaînes entre guillemets qui devraient empêcher l'injection de sql. – pbasdf