web-dev-qa-db-fra.com

Stocker la valeur booléenne dans SQLite

Quel est le type d'une valeur BOOL dans SQLite? Je veux stocker dans ma table les valeurs TRUE/FALSE.

Je pourrais créer une colonne de INTEGER et y stocker les valeurs 0 ou 1, mais ce ne sera pas le meilleur moyen d'implémenter le type BOOL.

Y a-t-il un moyen?

Merci.

250

Il n'y a pas de type de données booléen natif pour SQLite. Selon le Datatypes doc :

SQLite n'a pas de classe de stockage booléenne séparée. Au lieu de cela, les valeurs booléennes sont stockées en tant que nombres entiers 0 (faux) et 1 (vrai).

SQLite type de données booléen:
SQLite n'a pas de classe de stockage booléenne séparée. Au lieu de cela, les valeurs booléennes sont stockées en tant que nombres entiers 0 (faux) et 1 (vrai).

Vous pouvez convertir boolean en int de cette façon:

int flag = (boolValue)? 1 : 0;

Vous pouvez reconvertir int en booléen comme suit:

 // 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 vous voulez explorer sqlite, voici un tutoriel .
J'ai donné une réponse ici . Cela fonctionne pour eux.

83

Dans SQLite, le mieux que vous puissiez faire est d'utiliser les entiers 0 et 1 pour représenter false et true. Vous pouvez déclarer le type de colonne comme ceci:

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

Omettez le NOT NULL si vous souhaitez autoriser NULL en plus de 0 et 1.

L'utilisation du nom de type BOOLEAN est ici pour la lisibilité, pour SQLite c'est juste un type avec affinité NUMERIC .

Notez que contraintes de CHECK ont été supportés depuis SQLite 3.3. (2006).

Voici quelques exemples d'insert qui fonctionneront: (notez comment les chaînes et les nombres à virgule flottante sont analysés comme des entiers)

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

et d'autres qui échoueront:

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
77
ericwa

utiliser le type de données Integer avec les valeurs 0 et 1 est le plus rapide.

7
Logvinov Alecksey

Toutefois, si vous souhaitez en stocker plusieurs, vous pouvez les décaler un peu et les stocker tous comme un seul int, un peu comme les autorisations/modes de fichiers unix.

Pour le mode 755 par exemple, chaque chiffre correspond à une classe d'utilisateurs différente: propriétaire, groupe, public. Dans chaque chiffre, 4 est lu, 2 est écrit, 1 est exécuté, 7 est donc identique au 11 binaire. 5 est lu et est exécuté ainsi 101. Créez votre propre schéma de codage.

Je suis juste en train d'écrire quelque chose pour stocker des données d'horaire de télévision de Schedules Direct et j'ai les champs binaires ou oui/non: stéréo, hdtv, nouveau, ei, sous-titré, dolby, sève en espagnol, avant-première de la saison. Donc 7 bits, ou un entier avec un maximum de 127. Un caractère vraiment.

Un exemple C de ce que je travaille maintenant. has () est une fonction qui renvoie 1 si la deuxième chaîne est dans la première. inp est la chaîne d'entrée de cette fonction. misc est un caractère non signé initialisé à 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;

Donc, je stocke 7 booléens dans un entier avec de la place pour plus.

5
Alan Corey

Suite à la réponse d'Ericwa. Les contraintes CHECK peuvent activer une colonne pseudo-booléenne en imposant un type de données TEXT et en n'autorisant que les valeurs TRUE ou FALSE, par exemple.

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
4
Martin Hurford

Vous pouvez simplifier les équations ci-dessus en utilisant les éléments suivants:

boolean flag = sqlInt != 0;

Si la représentation int (sqlInt) du booléen est 0 (faux), le booléen (indicateur) sera faux, sinon ce sera vrai.

Code concis est toujours plus agréable de travailler avec :)

2