studio qué proveedor getcontentresolver content contenidos contenido android sqlite android-contentprovider

qué - proveedor de contenido android



¿Por qué ContentValues tiene un método put que admite Boolean? (2)

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

Después de leer this documento, parece que la conversión de booleano a entero la realiza SQLite.

Además, ¿por qué no hay un método getBoolean gratuito en un Cursor? Para mí, esto parece ser una supervisión de diseño bastante horrible ya que no parece haber una forma "segura" de recuperar un valor booleano que se puso en la base de datos a través de los valores de contenido. ¿Qué me estoy perdiendo?

Si está leyendo desde un cursor, entonces sabe qué columnas deberían devolverse de la consulta, por lo que presumiblemente conoce 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 getBoolean .

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

Además, ¿por qué no hay un método getBoolean gratuito en un Cursor? Para mí, esto parece ser una supervisión de diseño bastante incómoda ya que no parece haber una forma "segura" de recuperar un valor booleano que se puso en la base de datos a través de los valores de contenido. ¿Qué me estoy perdiendo?

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


ACTUALIZAR

Google ha corregido el error mencionado anteriormente, aunque todavía no está 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 el capó.

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

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

Cuando recupere el campo a través de ContentValues.getBoolean SIEMPRE obtendrá false:

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

Como el valor es "0" o "1", esta conversión falla:

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

Así que te recomiendo que crees tu propio getter y setter para que tu comportamiento esté bien definido.