Diferencia entre rawquery y execSQL en android sqlite base de datos
¿Cuál es la diferencia exacta entre usar rawquery y execSQL? Al escribir una consulta en la actividad android, cuándo usar rawquery y cuándo usar execSQL?
- Cómo escapar caracteres especiales como 'en sqlite en android
- SQLite - insertar una cadena con nuevas líneas en la base de datos desde el archivo csv
- Java.lang.IllegalStateException: intento de volver a abrir un objeto ya cerrado (Tried closing)
- Problema de orden de consultas SQLite de Android
- Obtener cuenta con cursor.getCount () o para ejecutar un rawQuery con un COUNT en una cláusula SQL?
- ¿Cómo funciona un cursor SQLite trabajar internamente?
- Método SQLiteDatabase.query
- ¿Cuál es la mejor estrategia de clave primaria para una aplicación móvil en línea / offline multi-cliente con base de datos SQLite y Azure SQL como almacén central?
- Compartir base de datos SQLite entre 2 aplicaciones de Android?
- Sincronización entre la base de datos SQL Lite en un dispositivo android y la base de datos de SQL Server
- Cómo crear sqlite declaración preparada en OrmLite?
- Cómo incluir un booleano en una cláusula sql lite where
- ¿Cómo puedo extraer la base de datos sqlite desde el dispositivo Android?
De la documentación de la API:
void execSQL (String sql)
Ejecute una sola instrucción SQL que no sea SELECT ni ninguna otra sentencia SQL que devuelva datos.
void execSQL (String sql, Object[] bindArgs)
Ejecute una sola instrucción SQL que NO es SELECT / INSERT / UPDATE / DELETE.
La documentación es inconsistente pero se comportan igual. La documentación de este último es más profunda.
Cursor rawQuery (String sql, String[] selectionArgs)
Ejecuta el SQL proporcionado y devuelve un Cursor sobre el conjunto de resultados.
Los usos para rawQuery
son:
- Desea consultar la base de datos con una instrucción
SELECT
.
=>rawQuery("SELECT ...
devuelve un conjunto de filas y columnas en unCursor
.- Es más eficiente usar
DatabaseUtils.longForQuery(SQLiteDatabase, String, String[])
oDatabaseUtils.stringForQuery(...)
en casos sólo hay un resultado de consulta 1×1, como desde laSELECT count(*) FROM table
(que también lo tiene Propio método dedicado:DatabaseUtils.queryNumEntries(...)
): esto evita la creación de un objetoCursor
y simplifica el código ya que tampoco hay nada que cerrar, moveToNext, etc.
- Es más eficiente usar
- Casos especiales como
PRAGMA table_info
que devuelve datos en filas (ver esta pregunta ) - Nota: No utilice
rawQuery
paraINSERT
,UPDATE
oDELETE
o cualquier otra cosa que modifique la base de datos. Se ejecutará en "¿Por qué una eliminación rawQuery necesita un moveToFirst con el fin de eliminar realmente las filas?" . La razón es que las consultas pueden diferir la lectura del resultado hasta que sea necesario (= acceso al cursor) lo que significa que SQLite retrasa la ejecución de la sentencia .
Los usos para execSQL
son:
- Tiene "instrucciones" para la base de datos. Como
CREATE TABLE
(o cualquier otra instrucciónCREATE
, por ejemplo,CREATE INDEX
),DROP
,PRAGMA
s que establecen propiedades en lugar de devolverlas, … -
INSERT
,UPDATE
oDELETE
cuando no esté interesado en la cantidad de filas modificadas o en el id de fila del último inserto.- Cuando los necesite, utilice los métodos
update()
,insert()
,delete()
o utilice una segunda instrucción para leer aquellos:DatabaseUtils.longForQuery
conSELECT last_insert_rowid()
oSELECT changes()
. Ambos devuelven sólo un valor entero. (Consulte "Obtener las filas actualizadas cuentan desde SQLite en Android usando una consulta sin procesar?" Y "SELECT last_insert_rowid ()" siempre devuelve "0" )
- Cuando los necesite, utilice los métodos
- Cualquier otra cosa que se basa en la ejecución de una declaración.
Si desea ejecutar algo en la base de datos sin importar su salida (por ejemplo, crear / alterar tablas), utilice execSQL , pero si espera algunos resultados en contra de su consulta (por ejemplo, seleccione registros), use rawQuery
- Cómo extraer el texto del elemento seleccionado en el listView
- ¿Cómo ejecutar una aplicación específica de Android con Terminal?