2009-08-18 11 views
41

que desea realizar una consulta como la siguiente:cotizaciones Android dentro de una cadena de consulta SQL

uvalue = EditText(some user value); 
p_query = "select * from mytable where name_field = '" + uvalue + "'" ; 
mDb.rawQuery(p_query, null); 

si el usuario introduce una comilla simple en su entrada se bloquea. Si lo cambia a:

p_query = "select * from mytable where name_field = \"" + uvalue + "\"" ; 

se bloquea si el usuario introduce una comilla doble en su entrada. y, por supuesto, siempre podían ingresar comillas simples o dobles.

+0

miannelle, echa un vistazo estas preguntas relacionadas: http://stackoverflow.com/questions/29699/how-do-i-deal-with-quotes-in-sql http://stackoverflow.co m/questions/387198/escape-double-quotes-in-sql-2005-2008 –

+3

miannelle: Debería considerar marcar algunas de sus preguntas como "respondidas" – Kurru

Respuesta

125

usted debe hacer uso de los parámetros del método rawQueryselectionArgs:

p_query = "select * from mytable where name_field = ?"; 
mDb.rawQuery(p_query, new String[] { uvalue }); 

Esto no sólo resuelve su problema cotizaciones sino también mitiga SQL Injection.

+5

¡Ojalá pudiera actualizar esto más de una vez! – jrockway

+1

También es mucho más rápido porque Sqlite no tiene que analizar todos los enunciados SQL. – tuinstoel

+20

De hecho, debe usar argumentos de consulta. Sin embargo, también puede usar DatabaseUtils para escapar cadenas, si es necesario. Por ejemplo, DatabaseUtils.sqlEscapeString(). No es la mejor manera, pero está disponible. Podría ser útil si está tratando de pasar una instrucción SQL sin procesar a algo externo. – lilbyrdie

14

DatabaseUtils.sqlEscapeString funcionó correctamente para mí. La cadena está encerrada por comillas simples y las comillas simples dentro de la cadena se convierten en comillas dobles. Probado usando selection Controls en la consulta getContentResolver().() Pero no funcionó en absoluto.

2

¿Ha intentado reemplazar una comilla simple con 2 comillas simples? Eso funciona para ingresar datos en una base de datos.

+0

Preferiría usar la respuesta principal, pero en mi caso no fue posible hacer para el diseño de la aplicación.Esto también funciona – Patrick

1

Tengo mismo problema pero ahora se resuelve con sólo escribir el código como en su caso desea insertar valor Uvalue .A continuación, escribir como

uvalue= EditText(some user value); 
uvalue = uvalue.replaceAll("'", "''"); 
p_query = "select * from mytable where name_field = '" + uvalue + "'" ; 
mDb.rawQuery(p_query, null); 

cool .. !!

+1

que es estúpido, estás reemplazando 'con' ', que aún causará problemas. – stealthcopter

+0

Quizás sea estúpido, pero funciona bien para mí. Gracias –

+0

@stealthcopter Eso no es estúpido, la manera estándar de SQL de escapar una comilla simple en un literal de cadena es doblarla, por lo que ''' ''' es una cadena de SQL literal que contiene una sola comilla. Es posible que escanear manualmente cadenas para SQL no sea la mejor idea, pero el resultado es correcto en este caso. –

1

prefiero escapar comillas simples y dobles en cada instrucción de inserción con SQLite como esto:

String sqlite_stament = sqlite_stament.replace("'", "''").replace("\"", "\"\""); 
2

debería cambiar

p_query = "select * from mytable where name_field = '" + uvalue + "'" ; 

como

p_query = "select * from mytable where name_field = '" + android.database.DatabaseUtils.sqlEscapeString(uvalue)+ "'" ; 
+0

Solución impresionante y clara –

+0

pero necesita eliminar las comillas porque se agregan por defecto –

Cuestiones relacionadas