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.

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?

  • ¿Detectando la transacción olvidada de SQLite en Android usando StrictMode?
  • Insertar datos JSON en la base de datos SQLite en android
  • ¿Cómo puedo actualizar un valor de columna de la base de datos android sqlite a null usando ContentValues?
  • Problema en sqlite con "como" en android
  • Cursor.getType () y CursorIndexOutOfBoundsException excepción
  • Intenta invocar el método virtual 'java.lang.Class java.lang.reflect.Field.getType ()' en una referencia de objeto nulo
  • Los datos se rellenan de la fecha de una tabla en particular en lugar de toda la tabla en sqlite
  • Consulta de suma en sqlite en android
  • La base de datos Sqlite onUpgrade () no se llama
  • Cómo convertir de java.util.HashMap a android.content.ContentValues?
  • SQLite de Android que elimina una fila específica de la base de datos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.