Cómo escapar personajes especiales como ‘in sqlite en android

Tengo una función que está ejecutando una consulta en una tabla en la base de datos SQLite. Declaro una constante: public static final String CANADA_HISTORY = "Canada's History"; . Esto se almacena en una variable String digamos difficulty ,

Tengo una consulta:

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

Lanza una excepción cerca del apóstrofo.

Salida de 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' 

También he intentado:

 1. difficulty=difficulty.replaceAll("'","''"); 2. difficulty=difficulty.replaceAll("'","\'"); 3. difficulty = DatabaseUtils.sqlEscapeString(difficulty); 

Para agregar a eso, me está resultando útil para las palabras sueltas, como la Canada History , es decir, sin la palabra de carácter especial.

Por favor, dame consejos para resolver el problema Gracias.

Primero reemplaza el char con este

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

luego pásalo en tu consulta

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

Editar:

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

El estándar SQL especifica que las comillas simples en cadenas se escapan colocando dos comillas simples en una fila. SQL funciona como el lenguaje de progtwigción Pascal en este sentido. SQLite sigue este estándar. Ejemplo:

 INSERT INTO xyz VALUES('5 O''clock'); 

Ref: Preguntas frecuentes sobre SQLite

La mejor manera es usar un método Android nativo diseñado para este propósito:

 DatabaseUtils.sqlEscapeString(String) 

Aquí está la documentación para ello en línea:

  • sqlEscapeString () en los desarrolladores de Android

La principal ventaja de usar este método, en mi opinión, es la auto-documentación debido al nombre claro del método.

Lo que funcionó para mí fue

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

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

Esto funcionará de la misma manera

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

o

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

pero en realidad usamos los siguientes símbolos% y _

Lo que DatabaseUtils.sqlEscapeString(s) hace esencialmente es reemplazar todas las comillas simples ( ' ) con dos comillas simples ( '' ) y anexar una comilla simple al principio y una al final de la Cadena.
Entonces, si solo quieres escapar del String, esta función debería funcionar:

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

Según mi entendimiento, hay dos accesos,

String test = “Prueba de Android” test = test.replace (“‘”, “‘ ‘”);

Este escenario es absolutamente bueno, pero definitivamente sugeriría utilizar el siguiente enfoque.

String test = “Prueba de Android” test = test.replaceAll (“‘”, “\'”);

Nos enfrentamos al problema debido al primer enfoque cuando intentábamos actualizar y seleccionar SQLite Table Value con ‘.

¿no necesitas escapar también del \? entonces sería replaceAll("'", "\\'") O estoy equivocado al respecto?