Comment échapper à des caractères spéciaux comme " dans sqlite dans android
j'ai une fonction qui exécute une requête sur une table dans la base de données SQLite. Je déclare une constante: public static final String CANADA_HISTORY = "Canada's History";
. C'est stockée dans un String
variable disons difficulty
,
j'ai une requête:
Cursor c = mDb.rawQuery("select * from Questions_answers where CHAPTERS = '"+difficulty+"'" , null);
il lance une exception près de l'apostrophe.
sortie Logcat:
I/Database( 1170): sqlite returned: error code = 1, msg = near "s": syntax error
D/AndroidRuntime( 1170): Shutting down VM
W/dalvikvm( 1170): threadid=1: thread exiting with uncaught exception (group=0x40015560)
E/AndroidRuntime( 1170): FATAL EXCEPTION: main
E/AndroidRuntime( 1170): android.database.sqlite.SQLiteException: near "s": syntax error: , while compiling: select * from Questions_answers where CHAPTERS = 'Canada's History'
j'ai aussi essayé:
1. difficulty=difficulty.replaceAll("'","''");
2. difficulty=difficulty.replaceAll("'","'");
3. difficulty = DatabaseUtils.sqlEscapeString(difficulty);
Pour ajouter à cela, c'est de travailler pour moi le seul des mots comme Canada History
, je veux dire sans caractères spéciaux mot.
Merci de me donner des conseils pour résoudre le problème Merci.
9 réponses
remplacer d'abord char par ceci
difficulty=difficulty.replaceAll("'","\'");
puis la passer dans votre requête
"select * from Questions_answers where CHAPTERS='"+difficulty+"'";
Edit :
q = "select * from Questions_answers where CHAPTERS = ?";
database.rawQuery(q, new String[] { difficulty});
le standard SQL spécifie que les guillemets simples dans les chaînes sont échappés en mettant deux guillemets simples dans une rangée. SQL fonctionne comme le langage de programmation Pascal à cet égard. SQLite suit cette norme. Exemple:
INSERT INTO xyz VALUES('5 O''clock');
Réf : SQLite FAQ
Le meilleur moyen est d'utiliser un natif Android méthode conçue pour exactement cet effet:
DatabaseUtils.sqlEscapeString(String)
Voici la documentation en ligne:
Le principal avantage de l'utilisation de cette méthode, à mon avis, est l'auto-documentation, car le nom de la méthode.
ce qui a fonctionné pour moi était
if (columnvalue.contains("'")) {
columnvalue = columnvalue.replaceAll("'", "''");
}
vous pouvez essayer Cursor c = mDb.rawQuery("select * from Questions_answers where CHAPTERS = \""+difficulty+"\"" , null);
Ce travail sera le même:
if (columnValue.contains("'"))
columnValue = columnValue.replaceAll("'", "[']");
ou
if (columnValue.contains("'"))
columnValue = columnValue.replaceAll("'", "\\'");
mais en réalité nous utilisons les symboles suivants % et_
DatabaseUtils.sqlEscapeString(s)
essentiellement, est de remplacer tous les guillemets simples ('
) avec deux guillemets simples (''
) et ajouter une apostrophe au début et un à la fin de la Chaîne.
alors si vous voulez simplement échapper à la chaîne de caractères, Cette fonction devrait fonctionner:
private static String escape(String s) {
return s != null ? s.replaceAll("\'", "\'\'") : null;
}
D'après ce que j'ai compris, il y a deux approches,
test String= "version Android"" test= test.remplacer("'",""");
ce scénario est absolument parfait, mais je suggérerais certainement d'utiliser l'approche suivante.
test String= "version Android"" test= test.replaceAll("'","\'");
nous avons affronté le problème à cause de la première approche lorsque nous avons essayé de mettre à jour et de sélectionner SQLite Le tableau de la Valeur".
Vous n'avez pas besoin d'échapper au \ aussi bien? il serait donc replaceAll("'", "\'")
Ou je me trompe?