fields - sqlite timestamp
Almacenar valor booleano en SQLite (9)
En SQLite lo mejor que puedes hacer es usar los números enteros 0 y 1 para representar falso y verdadero. Podrías declarar el tipo de columna así:
CREATE TABLE foo(mycolumn BOOLEAN NOT NULL CHECK (mycolumn IN (0,1)));
Omita NOT NULL
si desea permitir NULL
además de 0 y 1.
El uso del nombre de tipo BOOLEAN
aquí es para facilitar la lectura, para SQLite es solo un tipo con afinidad NUMÉRICA .
Tenga en cuenta que las restricciones CHECK se han admitido desde SQLite 3.3.0 (2006).
Aquí hay algunos ejemplos de INSERT que funcionarán: (observe cómo las cadenas y los números de punto flotante se analizan como enteros)
sqlite> INSERT INTO foo VALUES(0);
sqlite> INSERT INTO foo VALUES(1);
sqlite> INSERT INTO foo VALUES(0.0);
sqlite> INSERT INTO foo VALUES(1.0);
sqlite> INSERT INTO foo VALUES("0.0");
sqlite> INSERT INTO foo VALUES("1.0");
sqlite> select mycolumn, typeof(mycolumn) from foo;
0|integer
1|integer
0|integer
1|integer
0|integer
1|integer
y algunos que van a fallar:
sqlite> INSERT INTO foo VALUES("-1");
Error: constraint failed
sqlite> INSERT INTO foo VALUES(0.24);
Error: constraint failed
sqlite> INSERT INTO foo VALUES(100);
Error: constraint failed
sqlite> INSERT INTO foo VALUES(NULL);
Error: foo.mycolumn may not be NULL
sqlite> INSERT INTO foo VALUES("true");
Error: constraint failed
sqlite> INSERT INTO foo VALUES("false");
Error: constraint failed
¿Cuál es el tipo para un valor BOOL en SQLite? Quiero almacenar en mi tabla los valores de VERDADERO / FALSO.
Podría crear una columna de INTEGER y almacenar en ella los valores 0 o 1, pero no será la mejor manera de implementar el tipo BOOL.
¿Hay alguna manera?
Gracias.
Más allá de la respuesta de ericwa. Las restricciones CHECK pueden habilitar una columna pseudo-booleana mediante la aplicación de un tipo de datos TEXT y permitiendo solo valores TRUE o FALSE específicos de un caso, por ejemplo
CREATE TABLE IF NOT EXISTS "boolean_test"
(
"id" INTEGER PRIMARY KEY AUTOINCREMENT
, "boolean" TEXT NOT NULL
CHECK( typeof("boolean") = "text" AND
"boolean" IN ("TRUE","FALSE")
)
);
INSERT INTO "boolean_test" ("boolean") VALUES ("TRUE");
INSERT INTO "boolean_test" ("boolean") VALUES ("FALSE");
INSERT INTO "boolean_test" ("boolean") VALUES ("TEST");
Error: CHECK constraint failed: boolean_test
INSERT INTO "boolean_test" ("boolean") VALUES ("true");
Error: CHECK constraint failed: boolean_test
INSERT INTO "boolean_test" ("boolean") VALUES ("false");
Error: CHECK constraint failed: boolean_test
INSERT INTO "boolean_test" ("boolean") VALUES (1);
Error: CHECK constraint failed: boolean_test
select * from boolean_test;
id boolean
1 TRUE
2 FALSE
Otra forma de hacerlo es una columna de texto. Y luego convierta el valor booleano entre Booleano y Cadena antes / después de guardar / leer el valor de la base de datos.
Ex. Tienes "boolValue = true;
"
Encadenar:
//convert to the string "TRUE"
string StringValue = boolValue.ToString;
Y de vuelta al booleano:
//convert the string back to boolean
bool Boolvalue = Convert.ToBoolean(StringValue);
Pero, si desea almacenar un montón de ellos, puede cambiarlos por bits y almacenarlos todos a la vez, como en los permisos / modos de archivos de Unix.
Por ejemplo, para el modo 755, cada dígito se refiere a una clase diferente de usuarios: propietario, grupo, público. Dentro de cada dígito se lee 4, 2 se escribe, 1 se ejecuta, 7 es todo como el binario 111. 5 se lee y se ejecuta 101. Componga su propio esquema de codificación.
Solo estoy escribiendo algo para almacenar datos de programación de TV de Schedules Direct y tengo los campos binario o sí / no: estéreo, hdtv, nuevo, ei, subtítulos, dolby, savia en español, estreno de la temporada. Entonces, 7 bits, o un entero con un máximo de 127. Un carácter realmente.
AC ejemplo de lo que estoy trabajando ahora. has () es una función que devuelve 1 si la segunda cadena está en la primera. inp es la cadena de entrada a esta función. misc es un char sin signo inicializado a 0.
if (has(inp,"sap=''Spanish''") > 0)
misc += 1;
if (has(inp,"stereo=''true''") > 0)
misc +=2;
if (has(inp,"ei=''true''") > 0)
misc +=4;
if (has(inp,"closeCaptioned=''true''") > 0)
misc += 8;
if (has(inp,"dolby=") > 0)
misc += 16;
if (has(inp,"new=''true''") > 0)
misc += 32;
if (has(inp,"premier_finale=''") > 0)
misc += 64;
if (has(inp,"hdtv=''true''") > 0)
misc += 128;
Así que estoy almacenando 7 booleanos en un entero con espacio para más.
Podrías simplificar las ecuaciones anteriores usando lo siguiente:
boolean flag = sqlInt != 0;
Si la representación int (sqlInt) del booleano es 0 (falso), el booleano (flag) será falso, de lo contrario será verdadero.
El código conciso siempre es mejor para trabajar con :)
UPDATE table SET Boolcolumn = ''1'' WHERE ......
el uso del tipo de datos Integer con valores 0 y 1 es el más rápido.
Tipo de datos booleano SQLite :
SQLite no tiene una clase de almacenamiento booleana separada. En su lugar, los valores booleanos se almacenan como números enteros 0 (falso) y 1 (verdadero).
Puedes convertir booleano a int de esta manera:
int flag = (boolValue)? 1 : 0;
Puede convertir int de nuevo a booleano de la siguiente manera:
// Select COLUMN_NAME values from db.
// This will be integer value, you can convert this int value back to Boolean as follows
Boolean flag2 = (intValue == 1)? true : false;
Si quieres explorar sqlite, aquí hay un tutorial .
He dado una respuesta here . Está funcionando para ellos.
No hay ningún tipo de datos booleano nativo para SQLite. Por el documento Datatypes :
SQLite no tiene una clase de almacenamiento booleana separada. En su lugar, los valores booleanos se almacenan como números enteros 0 (falso) y 1 (verdadero).