long fields sqlite

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