¿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

 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 ?

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 actualizo mi ListView después de los cambios en la base de datos?
  • Android sqlite: No se pudo cambiar la configuración regional de db en 'zh_CN'
  • Android - cómo utilizar "select last_insert_rowid ();"
  • ¿Cómo manejas los registros de antememoria de caché en la aplicación para móviles
  • Sugar ORM en Android: actualiza un objeto guardado en SQLite
  • ¿Es posible usar Couch DB o MySql o cualquier otro DB en Android?
  • No se puede actualizar el campo TextView dentro de RecyclerView
  • No se puede eliminar la columna de la tabla sqlite
  • ¿Cómo obtener el ID guardado en SugarORM?
  • copia sqlite db al dispositivo android falla
  • Obtener ID de fila de una tabla SQLite FTS3
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.