web-dev-qa-db-fra.com

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";. Ceci est stocké dans une variable String disons difficulty,

J'ai une requête:

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

Il lève 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, ça me fonctionne pour les mots simples comme Canada History, Je veux dire sans le caractère spécial Word.

Veuillez me donner des conseils pour résoudre le problème Merci.

42
Rahul Patel

Remplacez d'abord le caractère par ce

difficulty=difficulty.replaceAll("'","\\'");

puis passez-le dans votre requête

"select * from Questions_answers where CHAPTERS='"+difficulty+"'";

Modifier:

 q = "select * from Questions_answers where CHAPTERS = ?";
    database.rawQuery(q, new String[] { difficulty});
25
Chirag

La norme 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: FAQ SQLite

85
Pankaj Kumar

La meilleure façon est d'utiliser une méthode native Android conçue exactement à cette fin:

DatabaseUtils.sqlEscapeString(String)

Voici la documentation en ligne:

Le principal avantage de l'utilisation de cette méthode, à mon avis, est l'auto-documentation en raison du nom clair de la méthode.

46

Ce qui a fonctionné pour moi était

if (columnvalue.contains("'")) {
    columnvalue = columnvalue.replaceAll("'", "''");
}
25
Dhiraj Himani

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

3
jaredzhang

Cela fonctionnera de la même façon:

if (columnValue.contains("'")) 
    columnValue = columnValue.replaceAll("'", "[']");

ou

if (columnValue.contains("'")) 
    columnValue = columnValue.replaceAll("'", "\\\'");

mais en réalité, nous utilisons les symboles suivants% et _

2
Michael Popovich

Ce que DatabaseUtils.sqlEscapeString(s) fait essentiellement, c'est remplacer tous les guillemets simples (') avec deux guillemets simples ('') et ajoutez une citation unique au début et une à la fin de la chaîne.
Donc, si vous voulez juste échapper à la chaîne, cette fonction devrait fonctionner:

private static String escape(String s) {
    return s != null ? s.replaceAll("\'", "\'\'") : null;
}
1
Onno Eberhard

Selon ma compréhension, il y a deux approcaches,

String test = "Android's vaersion" test = test.replace ("'", "' '");

Ce scénario est tout à fait correct, mais je suggérerais certainement d'utiliser l'approche suivante.

String test = "Android's vaersion" test = test.replaceAll ("'", "\'");

Nous avons rencontré le problème en raison de la première approche lorsque nous avons essayé de mettre à jour et de sélectionner la valeur de la table SQLite avec '.

0
Meghana Patil