¿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?
- Cambiar el número de versión de la base de datos SQLite
- Db-shm y db-wal en bases de datos sqlite
- Los ejemplos de ORMLite para Android no compilarán
- SQLiteOpenHelper onCreate no crea base de datos - o se está sobrescribiendo inmediatamente
- Desarrollo de Android - SQLite storage float
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é.
- RawQuery: enlace o índice de columna fuera de rango
- Android java.lang.IllegalStateException: No se pudo leer la fila 0, col 0 de CursorWindow
- androide sqlite cómo ordenar por el tiempo
- ¿Es mi consulta sqlite equivocada?
- Eliminar el número especificado de filas de la base de datos SQLite
- Aclaración sobre el row_id devuelto por la instrucción de inserción de sqlite
- SQLiteDatabase.insertOrThrow no se lanza pero no se insertan datos
- SQLCipher para Android getReadableDatabase () Sobrehéroe
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.
- Google Maps v2 Marker zOrdering – Establecer en la parte superior
- Android "Sólo el subproceso original que creó una jerarquía de vistas puede tocar sus vistas." Error en Fragmento