¿Por qué ContentValues ​​tiene un método put que admite booleanos?

La clase ContentValues ​​contiene un método que permite que los booleanos se incluyan en la colección de valores. AFAIK, SQLite no contiene un formato booleano nativo en el que Android pudiera empujar los valores booleanos. Entonces, ¿qué magia hace Android hacer detrás de las escenas para almacenar estos valores?

Además, ¿por qué no hay método getBoolean de cortesía en un Cursor? Para mí, esto parece ser una supervisión de diseño bastante torpe ya que parece que no hay manera "segura" de recuperar un valor booleano que fue puesto en el DB a través de ContentValues. ¿Qué me estoy perdiendo?

Esta pregunta puede parecer un poco frívola, ya que sospecho que los booleanos se almacenan como un número entero de 1 o 0, pero ¿por qué Android se comprometería a los desarrolladores que hacen esa suposición? Ni siquiera está documentado por lo que sé.

La clase ContentValues ​​contiene un método que permite que los booleanos se incluyan en la colección de valores. AFAIK, SQLite no contiene un formato booleano nativo en el que Android pudiera empujar los valores booleanos. Entonces, ¿qué magia hace Android hacer detrás de las escenas para almacenar estos valores?

Desde la lectura de este documento, suena como la conversión booleana a entero es realizada por SQLite.

Además, ¿por qué no hay método getBoolean de cortesía en un Cursor? A mí, esto parece ser una supervisión bastante horrible del diseño puesto que parece no haber una manera "segura" de recuperar un valor boolean que fue puesto en el DB vía ContentValues. ¿Qué me estoy perdiendo?

Si está leyendo desde un cursor, entonces sabe qué columnas deben devolverse de la consulta, por lo que presumiblemente conocerá los tipos de datos de las columnas que se solicitaron. Estoy de acuerdo en que tener un método getBoolean sería mejor, pero no es difícil trabajar.

ACTUALIZAR

Google ha remendado el error antes mencionado, aunque aún no se ha implementado en el momento de esta publicación:

https://code.google.com/p/android/issues/detail?id=232274


Vale la pena señalar que la API actual es peligrosa y podría romper su aplicación si algo cambia bajo la campana.

Además, ContentValues.getBoolean tiene un problema importante que si crea el ContentValues con DatabaseUtils.cursorRowToContentValues tratará cada campo como una cadena:

values.put(columns[i], cursor.getString(i));

Cuando, a continuación, recuperar el campo a través de ContentValues.getBoolean siempre obtendrá falsa:

 if (value instanceof CharSequence) { return Boolean.valueOf(value.toString()); 

Puesto que el valor es "0" o "1" esta conversión falla:

 private static boolean toBoolean(String name) { return ((name != null) && name.equalsIgnoreCase("true")); 

Por lo tanto, recomiendo encarecidamente que cree su propio getter y setter para que su comportamiento está bien definido.

  • SQLite: Consulta que devuelve datos antiguos / en caché
  • Cómo utilizar Spatialite con Xamarin en Android
  • SQLite de repente considera todo como no un error
  • Cómo comprobar la base de datos en el dispositivo Android no enraizada
  • Android: Guardar imágenes en la base de datos Sqlite
  • Utilizar el operador OR con 2 marcadores de posición con el mismo valor
  • Android: Fragmentos, SQLite y cargadores
  • Intent.ACTION_PICK devuelve el cursor vacío para algunos contactos
  • Cómo reemplazar el archivo de base de datos sqlite existente con un nuevo archivo de base de datos en android
  • No se puede crear tabla TEMP en Android sqlite
  • Cómo modificar el valor de un elemento en un SQLite?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.