2012-01-12 22 views
25

Estoy desarrollando una aplicación de base de datos de Android. Solo quiero saber qué código se ejecuta más rápido y cuál es la diferencia entre ellos.Android SQLite: ¿Qué consulta ("consulta" o "rawQuery") es más rápida?

consultas - 1 =

db.rawQuery("select * from user_table where user_id =" + userId, null); 

consultas - 2 =

db.query(USER_TABLE_NAME, ALL_COLUMNS, "user_id = " + userId, null, null, null, null); 
+0

... pruébalo y ver? Voy a adivinar "lo mismo" para todos los intentos y propósitos. Pero, * utilice marcadores de posición en cualquier caso *. –

+0

Si ya tiene un sistema de compilación configurado, haga algunos puntos de referencia en él. Además, ¿qué tipo de carga de trabajo espera y qué márgenes de velocidad está buscando? –

Respuesta

15

Uso consulta.

Las consultas de precompilación de Android y el uso de demasiadas consultas crudas diferentes pueden causar problemas de rendimiento.

Utilice rawQuery solo cuando sea absolutamente necesario.

Además, ambos tienen un problema de seguridad MAYOR de inyección de SQL.

Debe desinfectar el userId.

La primera cosa que puede hacer es dejar que Android lo hacen mediante el uso de:

db.query(USER_TABLE_NAME, ALL_COLUMNS, "user_id = ?", new String[] {userId}, null, null, null); 
+3

Consultas precompiladas de RE: solo se aplican cuando se usa PreparedStatement. Query() solo crea la cadena y la pasa a rawQuery(). –

+0

Bueno, PreparedStatement está destinado a ejecutar la misma consulta varias veces, cierto, pero creo que el controlador también realiza algún tipo de optimización. Me he encontrado con un error al usar varias consultas diferentes de Android quejándose demasiadas declaraciones. :) –

+0

@JonAdams Por favor, ayúdame a entender tu comentario, "solo aplica cuando usas una declaración preparada", ¿dónde usamos la declaración preparada, mientras que la misma puede ser obtenida por rawQuery? (es decir, puede poner '?' y pasar argumentos?) – Darpan

5

En cuanto a SQLiteDatabase.java en la fuente androide muestra que la consulta (..) termina llamando a la QueryBuilder para construir el consulta como una sola cadena y luego esencialmente llama a rawQuery(). Deben ser aproximadamente equivalentes, suponiendo que también hiciste el mismo trabajo para construir tu propia declaración.

Cuestiones relacionadas