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.
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});
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
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.
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);
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 _
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;
}
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 '.