Cómo escapar caracteres especiales como 'en sqlite en android

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

Tengo una pregunta:

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

Está lanzando una excepción cerca del apóstrofe.

Salida 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á trabajando para las palabras simples como la Canada History , quiero decir, sin la palabra de carácter especial.

Por favor déme consejo para el problema de la resolución Gracias.

9 Solutions collect form web for “Cómo escapar caracteres especiales como 'en sqlite en android”

Primero reemplaza char con esto

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

Luego pasarla en su 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 pueden escapar poniendo dos comillas simples en una fila. SQL funciona como el lenguaje de programación Pascal en el sentido. SQLite sigue este estándar. Ejemplo:

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

Ref: FAQ de SQLite

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

 DatabaseUtils.sqlEscapeString(String) 

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

  • SqlEscapeString () en desarrolladores de Android

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

Lo que funcionó para mí fue

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

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

Esto funcionará igual:

 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) esencialmente hace, es reemplazar todas las comillas simples ( ' ) con dos comillas simples ( '' ) y añadir una única comilla al principio y una al final de la cadena.
Así que si sólo quieres escapar de la cadena esta función debería funcionar:

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

Según mi entendimiento hay dos approcaches,

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

Este escenario es absolutamente bien, pero sin duda sugeriría utilizar el siguiente enfoque.

Test de cadena = "Prueba de Android" test = test.replaceAll ("'", "\'");

Nos enfrentamos al problema debido al primer enfoque cuando estábamos tratando de actualizar y seleccionar SQLite Table Value con '.

¿No necesitas escapar del \ también? Por lo que sería replaceAll("'", "\\'") O estoy equivocado acerca de eso?

  • Inserte un número de cadena que empiece por cero en la columna de cadena usando ContentValues, pero el cero inicial siempre se elimina
  • Sqlite en Android: Cómo crear una función sqlite dist db - que se utilizará en la aplicación para calcular la distancia utilizando lat, largo
  • Recuperar un nombre de usuario y una contraseña en SQLITE DB por EMAIL_ADDRESS en ANDROID
  • Orden de clasificación de la consulta SQLiteDatabase de Android
  • GreenDao freemaker.jar está ausente
  • Alterar el campo único de la tabla
  • Iterar a través de filas desde Sqlite-query
  • ¿Cómo utilizo las sentencias preparadas en SQlite en Android?
  • Cursor de cierre en la base de datos SQLite explícitamente, necesarios o no necesarios?
  • Consulta SQLite SQLiteLog (1) no such Column:
  • Tratando de copiar SQLite DB desde datos a tarjeta SD
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.