2009-05-09 24 views
202

¿Cuál es el tipo para un valor BOOL en SQLite? Quiero almacenar en mi tabla los valores VERDADERO/FALSO.Almacenar valor booleano en SQLite

Podría crear una columna de INTEGER y almacenar en ella los valores 0 o 1, pero no será la mejor forma de implementar el tipo BOOL.

¿Hay alguna manera?

Gracias.

+0

posible duplicado de [¿Hay un literal booleano en SQLite?] (Http://stackoverflow.com/questions/2510652/is- there-a-boolean-literal-en-sqlite) –

Respuesta

277

No hay ningún tipo de datos booleanos para SQLite. Por el Datatypes doc:

SQLite no tiene una clase de almacenamiento booleana por separado. En cambio, los valores booleanos se almacenan como enteros 0 (falso) y 1 (verdadero).

+13

"INTEGER. El valor es un entero con signo, almacenado en 1, 2, 3, 4, 6 u 8 bytes, dependiendo de la magnitud del valor". Supongo que usar 1 byte para almacenar un BOOL no es tan malo. – joce

+1

Directamente desde la boca del caballo: "SQLite no tiene una clase de almacenamiento Boolean por separado. En su lugar, los valores booleanos se almacenan como enteros 0 (falso) y 1 (verdadero)". – Tobias

+2

¡Cuál es mejor en términos de rendimiento! verdadero/falso como cadenas o 0/1 entero? –

77

SQLite Boolean Datatype:
SQLite no tiene una clase de almacenamiento de Boole separada. En cambio, los valores booleanos se almacenan como enteros 0 (falso) y 1 (verdadero).

Puede convertir a int booleano de esta manera:

int flag = (boolValue)? 1 : 0; 

Puede convertir int volver 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 desea explorar sqlite, here is a tutorial.
He dado una respuesta here. Está trabajando para ellos.

+12

línea final de código podría ser "Boolean flag2 = (intValue == 1)" – cja

+10

Sugiero 'Boolean flag2 = (intValue!= 0); ' –

+0

o simplemente puede hacer Boolean flag2 = (intValue> 0); –

7

utilizando el tipo de datos Integer con los valores 0 y 1 es el más rápido.

-3

Otra forma de hacerlo es una columna de TEXTO. Y luego convierta el valor booleano entre Boolean y String antes/después de guardar/leer el valor de la base de datos.

Ej. Tiene "boolValue = true; "

Para la secuencia:

//convert to the string "TRUE" 
string StringValue = boolValue.ToString; 

Y de vuelta a booleano:

//convert the string back to boolean 
bool Boolvalue = Convert.ToBoolean(StringValue); 
+3

@Craig McMahon sugiere utilizar Integer en su lugar: los números primos representan verdadero, los no primos representan falso – Berik

+13

Me resulta muy ofensivo, @Berik. La solución obvia es representar la palabra "VERDADERO" o "FALSO" en una imagen y luego guardarla en la fila de la base de datos como un BLOB con codificación JPEG. Uno podría leer el valor de nuevo usando un algoritmo de extracción de características simple. –

55

En SQLite lo mejor que puede hacer es usar los números enteros 0 y 1 para representar falso y verdadero. Se podría declarar el tipo de columna de la siguiente manera:

CREATE TABLE foo(mycolumn BOOLEAN NOT NULL CHECK (mycolumn IN (0,1))); 

omite el NOT NULL si desea permitir NULL además de 0 y 1.

El uso del nombre del tipo BOOLEAN aquí es para facilitar la lectura, a SQLite es sólo un tipo with NUMERIC affinity.

Tenga en cuenta que CHECK constraints son compatibles desde SQLite 3.3.0 (2006).

Estas son algunas inserciones de ejemplo que va a trabajar: (tenga en cuenta la forma en cadenas y números de coma 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 se producirá un error:

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 
1

Se podría simplificar el ecuaciones anteriores usando lo siguiente:

boolean flag = sqlInt != 0; 

Si la representación int (sqlInt) de el booleano es 0 (falso), el booleano (indicador) será falso, de lo contrario será verdadero.

código conciso siempre es más agradable trabajar con :)

4

con la respuesta de ericwa. Las restricciones CHECK pueden habilitar una columna pseudo booleana imponiendo un tipo de datos TEXTO y solo permitiendo valores específicos de caso TRUE o FALSE, p.

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 
3

Pero, si se desea almacenar un montón de ellos que podría cambiar de bits y almacenarlos todos como uno int, un poco como de archivos UNIX permisos/modos.

Para el modo 755, por ejemplo, cada dígito se refiere a una clase diferente de usuarios: propietario, grupo, público. Dentro de cada dígito 4 se lee, 2 es escritura, 1 se ejecuta, por lo que 7 es como el 111 binario. 5 se lee y se ejecuta así 101. Cree su propio esquema de codificación.

Estoy escribiendo algo para almacenar datos de programación de TV de Schedules Direct y tengo los campos binarios o sí/no: estéreo, hdtv, nuevo, ei, subtítulos, dolby, sap en español, estreno de temporada. Entonces 7 bits, o un entero con un máximo de 127. Un personaje realmente.

Un ejemplo C 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. misceláneos es un unsigned char 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.

-1

UPDATE tabla SET Boolcolumn = '1' DONDE ......

+1

Agregue una explicación con la respuesta de cómo esta respuesta ayuda a OP a solucionar el problema actual –

Cuestiones relacionadas