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?

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 un Cursor .
    • Es más eficiente usar DatabaseUtils.longForQuery(SQLiteDatabase, String, String[]) o DatabaseUtils.stringForQuery(...) en casos sólo hay un resultado de consulta 1×1, como desde la SELECT count(*) FROM table (que también lo tiene Propio método dedicado: DatabaseUtils.queryNumEntries(...) ): esto evita la creación de un objeto Cursor y simplifica el código ya que tampoco hay nada que cerrar, moveToNext, etc.
  • Casos especiales como PRAGMA table_info que devuelve datos en filas (ver esta pregunta )
  • Nota: No utilice rawQuery para INSERT , UPDATE o DELETE 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ón CREATE , por ejemplo, CREATE INDEX ), DROP , PRAGMA s que establecen propiedades en lugar de devolverlas, …
  • INSERT , UPDATE o DELETE 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 con SELECT last_insert_rowid() o SELECT 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" )
  • 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

  • Db-shm y db-wal en bases de datos sqlite
  • Cómo ejecutar una consulta con regexp en Android
  • Se ha eliminado una columna no válida al intentar consultar una columna.
  • Cómo almacenar una imagen en la base de datos android
  • Android.database.CursorWindowAllocationException: La asignación de ventana de cursor de 2048 kb falló incluso después de cerrar el cursor
  • Evento de clic de AutoCompleteTextView en Android
  • Limitar los registros obtenidos en Android (base de datos Sqlite)
  • ¿Cómo obtener ID de contacto, correo electrónico, número de teléfono en una consulta SQLite? Optimización para Android de los contactos
  • No pudo leer la fila 0, la columna -1
  • Problemas en la creación de varias tablas en sqlite
  • Pasar una matriz de datos a una base de datos SQLite en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.