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.

36
demandé sur Gibron 2012-09-27 10:12:00

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});
23
répondu Chirag 2012-09-27 06:21:31

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

84
répondu Pankaj Kumar 2012-09-27 06:27:00

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.

43
répondu Richard Le Mesurier 2014-11-22 20:20:52

ce qui a fonctionné pour moi était

if (columnvalue.contains("'")) {
    columnvalue = columnvalue.replaceAll("'", "''");
}
25
répondu Dhiraj Himani 2014-07-10 10:06:42

vous pouvez essayer Cursor c = mDb.rawQuery("select * from Questions_answers where CHAPTERS = \""+difficulty+"\"" , null);

3
répondu jaredzhang 2012-09-27 06:32:40

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_

2
répondu Michael Popovich 2017-04-01 23:36:25

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;
}
1
répondu Onno Eberhard 2017-04-19 08:55:51

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".

0
répondu Meghana Patil 2016-02-17 08:50:09

Vous n'avez pas besoin d'échapper au \ aussi bien? il serait donc replaceAll("'", "\'") Ou je me trompe?

-1
répondu Genia S. 2012-09-27 06:25:32