Almacenar valor booleano en SQLite

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

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.

No existe un tipo de datos booleano nativo para SQLite. Según el documento de Datos de Datos :

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

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

Puede convertir boolean 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 desea explorar sqlite, aquí hay un tutorial .
He dado una respuesta aquí . Está trabajando para ellos.

En SQLite lo mejor que puede hacer es usar los enteros 0 y 1 para representar falso y verdadero. Puede declarar el tipo de columna como este:

 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 legibilidad, para SQLite es solo un tipo con afinidad NUMÉRICA .

Tenga en cuenta que las restricciones CHECK han sido soportadas 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 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 fallarán:

 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 

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

Además de la respuesta de Ericwa. Las restricciones CHECK pueden habilitar una columna pseudo booleana imponiendo un tipo de datos TEXT y solo permitiendo valores específicos de caso TRUE o FALSE, 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 

Pero, si desea almacenar una gran cantidad de ellos, podría cambiarlos y almacenarlos todos como uno solo, un poco como permisos / modos de archivos de Unix.

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 encoding.

Solo estoy escribiendo algo para almacenar datos de progtwigció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.

Ejemplo de AC 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 en 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.

Puede simplificar las ecuaciones anteriores usando lo siguiente:

 boolean flag = sqlInt != 0; 

Si la representación int (sqlInt) de boolean es 0 (falso), boolean (flag) será falso; de lo contrario, será verdadero.

El código conciso siempre es mejor para trabajar con 🙂

Tabla de ACTUALIZACIÓN SET Boolcolumn = ‘1’ DÓNDE ……

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

Ex. Tienes "boolValue = true;"boolValue = true;

Encadenar:

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

Y de vuelta a boolean:

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