¿Por qué algunos métodos SQLite esperan argumentos como un objeto , mientras que otros necesitan una cadena ?
Tengo curiosidad por el diseño de la API de SQLite de Android . Por ejemplo, tenemos
public void execSQL(String sql, Object[] bindArgs)
Para SQLs que no devuelven datos, y también tenemos
- Expulsión de desencadenamiento de SQLite para eliminar filas
- Unir 3 tablas en la base de datos SQLite
- Android: java.lang.IllegalStateException: base de datos xxx.db (conn # 0) ya cerrado
- SQLIte DROP tabla ROLL volver
- IllegalArgumentException: el valor de enlace en el índice 1 es nulo
public Cursor rawQuery(String sql, String[] selectionArgs)
Para SQLs que devuelven datos.
¿Por qué se esperan los argumentos como una matriz de objetos en la primera y como una matriz de cadenas en el último caso? Entiendo que aceptar sólo las cadenas puede tener sentido debido a la afinidad por tipo de SQLite. Sin embargo, si ese es el caso, ¿por qué no utilizar consistentemente arrays String para los argumentos? ¿Hay algún argumento no-String que tiene sentido para execSQL
pero no para rawQuery
?
- ¿Puede el androide sqlite interfaz ser utilizado fuera de Android
- Protección de bases de datos SQLite locales (aplicación Android)
- Aclaración sobre el row_id devuelto por la instrucción de inserción de sqlite
- android sqlite consulta con múltiples donde
- ¿Cómo establecer el tipo de datos en SQLiteDatabase vinculación de consulta en bruto?
- GreenDAO - clave primaria en varias columnas
- Consulta SQLite SQLiteLog (1) no such Column:
- Android abrir o crear base de datos
Hay uno. Por ejemplo, si desea comparar valores BLOB. Eche un vistazo a este ejemplo .
UUID almacenado como BLOB
db.execSQL("DELETE FROM "+USER_TABLE+" WHERE "+USER_UUID+"=?", new Object [] { uuid.toByteArray }
De acuerdo con la documentación, byte [] , String, Long y Double son compatibles en bindArgs. Sin embargo, no se recomienda utilizar este método para ejecutar las instrucciones SELECT / INSERT / UPDATE / DELETE.
Simplemente no sé por qué.
En realidad, aceptar sólo cadenas no tiene sentido porque las cadenas nunca se comparan igual con números, es decir, consultas como
c.rawQuery("SELECT * FROM mytable WHERE some_number_column = ?", args);
Nunca devolverá ningún registro con números. (Tendrías que declarar todas las columnas como TEXT
, y nunca usar expresiones o convertirlas con algo como CAST(... AS TEXT)
.)
Jens mencionó una posible explicación, pero eso no es excusa para un diseño inconsistente y llano.
- Cómo obtener el porcentaje de búfer de VideoView en Android
- Consultar contactos – SOMETIMES devuelve el cursor vacío