¿Cómo utilizo declaraciones preparadas en SQlite en Android?
android
sqlite
prepared-statement
pupeño
fuente
fuente
Respuestas:
Utilizo declaraciones preparadas en Android todo el tiempo, es bastante simple:
fuente
SQLiteStatement.bindXXX()
tiene un índice basado en 1, no basado en 0 como la mayoría.Para las declaraciones SQLite preparadas en Android, existe SQLiteStatement . Las declaraciones preparadas lo ayudan a acelerar el rendimiento (especialmente para declaraciones que deben ejecutarse varias veces) y también ayudan a evitar ataques de inyección. Consulte este artículo para obtener una discusión general sobre declaraciones preparadas.
SQLiteStatement
está destinado a utilizarse con sentencias SQL que no devuelven varios valores. (Eso significa que no los usaría para la mayoría de las consultas). A continuación se muestran algunos ejemplos:Crea una tabla
El
execute()
método no devuelve un valor, por lo que es apropiado usarlo con CREATE y DROP, pero no está destinado a usarse con SELECT, INSERT, DELETE y UPDATE porque estos devuelven valores. (Pero vea esta pregunta ).Insertar valores
Tenga en cuenta que el
executeInsert()
método se utiliza en lugar deexecute()
. Por supuesto, no querrá ingresar siempre las mismas cosas en cada fila. Para eso puedes usar enlaces .Por lo general, usa declaraciones preparadas cuando desea repetir algo rápidamente (como un INSERT) muchas veces. La declaración preparada hace que la declaración SQL no tenga que ser analizada y compilada cada vez. Puede acelerar las cosas aún más mediante transacciones . Esto permite que todos los cambios se apliquen a la vez. Aquí hay un ejemplo:
Consulte estos enlaces para obtener más información sobre transacciones y acelerar las inserciones de bases de datos.
Actualizar filas
Este es un ejemplo básico. También puede aplicar los conceptos de la sección anterior.
Eliminar filas
El
executeUpdateDelete()
método también se puede utilizar para declaraciones DELETE y se introdujo en la API 11. Consulte estas preguntas y respuestas .Aquí hay un ejemplo.
Consulta
Normalmente, cuando ejecuta una consulta, desea recuperar un cursor con muchas filas. Sin
SQLiteStatement
embargo, no es para eso . No ejecuta una consulta con él a menos que solo necesite un resultado simple, como el número de filas en la base de datos, lo que puede hacer consimpleQueryForLong()
Por lo general, ejecutará el
query()
método de SQLiteDatabase para obtener un cursor.Consulte esta respuesta para obtener mejores detalles sobre las consultas.
fuente
clearBindings()
no solo los configura ennull
(ver el código fuente ). Lo veo como una limpieza del estado para que nada lo influya desde el ciclo anterior. Sin embargo, quizás eso no sea necesario. Me alegraría que alguien que sepa comentar.Si desea un cursor al regresar, entonces podría considerar algo como esto:
Vea este fragmento de Genscripts en caso de que desee uno más completo. Tenga en cuenta que esta es una consulta SQL parametrizada, por lo que, en esencia, es una declaración preparada.
fuente
El ejemplo de jasonhudgins no funcionará. No puede ejecutar una consulta con
stmt.execute()
y recuperar un valor (o aCursor
).Solo puede precompilar declaraciones que no devuelvan filas en absoluto (como una declaración de inserción o creación de tabla) o una sola fila y columna (y use
simpleQueryForLong()
osimpleQueryForString()
).fuente
Para obtener un cursor, no puede usar un compiledStatement. Sin embargo, si desea utilizar una declaración SQL completamente preparada, le recomiendo una adaptación del método de jbaez ... Usando en
db.rawQuery()
lugar dedb.query()
.fuente