Хранить логическое значение в SQLite

186

Каков тип значения BOOL в SQLite? Я хочу сохранить в таблице значения TRUE/FALSE.

Я мог бы создать столбец INTEGER и сохранить в нем значения 0 или 1, но это не лучший способ реализовать тип BOOL.

Есть ли способ?

Спасибо.

Теги:

9 ответов

250
Лучший ответ

В SQLite отсутствует собственный тип данных типа boolean. На Datatypes doc:

SQLite не имеет отдельного булевского класса хранения. Вместо этого булевые значения сохраняются как целые числа 0 (ложь) и 1 (истина).

  • 19
    «INTEGER. Значением является целое число со знаком, сохраняемое в 1, 2, 3, 4, 6 или 8 байтах в зависимости от величины значения.» Я думаю, использование 1 байта для хранения BOOL не так уж плохо.
  • 1
    Прямо из уст Лошади: «SQLite не имеет отдельного класса логического хранения. Вместо этого логические значения хранятся в виде целых чисел 0 (ложь) и 1 (истина)».
Показать ещё 3 комментария
75

SQLite Boolean Тип данных:
SQLite не имеет отдельного булевского класса хранения. Вместо этого логические значения сохраняются как целые числа 0 (ложь) и 1 (истина).

Вы можете преобразовать boolean в int таким образом:

int flag = (boolValue)? 1 : 0;

Вы можете преобразовать int back в boolean следующим образом:

 // 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;

Если вы хотите изучить sqlite, вот учебник.
Я дал один ответ здесь. Он работает для них.

  • 12
    последняя строка кода может быть просто "Boolean flag2 = (intValue == 1)"
  • 12
    Я предлагаю Boolean flag2 = (intValue != 0);
Показать ещё 1 комментарий
51

В SQLite лучшее, что вы можете сделать, это использовать целые числа 0 и 1 для представления false и true. Вы можете объявить тип столбца следующим образом:

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

Опустите NOT NULL, если вы хотите разрешить NULL в дополнение к 0 и 1.

Использование имени типа BOOLEAN здесь для читаемости, для SQLite это просто тип с NUMERIC близостью.

Обратите внимание, что Ограничения CHECK поддерживаются с SQLite 3.3.0 (2006).

Вот некоторые примеры INSERT, которые будут работать: (обратите внимание, как строки и числа с плавающей запятой анализируются как целые числа)

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

а некоторые из них не будут выполняться:

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

В других ситуациях использование default с check очень полезно:

sqlite> create table test ( id integer, b boolean default 0 check(b in (0,1)) );
sqlite> select * from test ;
sqlite> insert into test (id,b) values (7777, 1);
sqlite> insert into test (id) values (8888);
sqlite> select * from test ;
7777|1
8888|0

Обратите внимание, что несколько смутно, так как check допускает только целое число 0 или целое число, значение действительно никогда не может быть null. Итак, в этом случае:

sqlite> insert into test (id) values (8888);

он вставляет значение по умолчанию, целое ноль.

Обратите внимание, что если вы также добавляете ограничение NOT NULL,

 b boolean not null default 0 check(b in (0,1))

что означает, что такие вставки:

  sqlite> insert into test (id) values (8888);

просто запрещены, они не могут произойти и будут вызывать ошибку.

7

используя тип данных Integer со значениями 0 и 1, является самым быстрым.

3

Но, если вы хотите сохранить кучу из них, вы можете поменять их и сохранить их как один int, немного похожий на разрешения/режимы файлов unix.

Например, для режима 755 каждая цифра относится к другому классу пользователей: владелец, группа, публикация. Внутри каждой цифры 4 читается, 2 записывается, 1 выполняется так, что 7 - это все, как бинарные 111. 5 читается и выполняется так 101. Составьте свою собственную схему кодирования.

Я просто пишу что-то для хранения данных расписания ТВ из Schedules Direct, и у меня есть двоичные или да/нет поля: стерео, hdtv, new, ei, close captioned, dolby, sap на испанском языке, премьера сезона. Таким образом, 7 бит или целое число с максимальным значением 127. Один символ действительно.

Пример из того, над чем я сейчас работаю. has() - это функция, которая возвращает 1, если вторая строка находится в первой. inp - входная строка для этой функции. misc - это unsigned char, инициализированный 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;

Итак, я сохраняю 7 булевых чисел в одном целом с комнатой для большего количества.

  • 0
    Вот это да. Спасибо за этот ответ - я полностью забыл, что это был вариант!
3

В дополнение к ответу ericwa. Ограничения CHECK могут включать псевдо-логический столбец, применяя тип данных TEXT и позволяя только значения, специфичные для конкретного случая или FALSE, например.

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
1

Вы можете упростить приведенные выше уравнения, используя следующее:

boolean flag = sqlInt != 0;

Если int-представление (sqlInt) логического значения равно 0 (false), логическое значение (флаг) будет false, иначе оно будет истинным.

Краткий код всегда приятнее работать с:)

0

Таблица UPDATE SET Boolcolumn = '1' WHERE......

  • 1
    Добавьте некоторое объяснение с ответом о том, как этот ответ поможет ОП в устранении текущей проблемы.
-4

Другой способ сделать это - столбец TEXT. А затем преобразуйте логическое значение между Boolean и String до/после сохранения/чтения значения из базы данных.

Ex. У вас "boolValue = true; "

В строку:

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

И вернемся к boolean:

//convert the string back to boolean
bool Boolvalue = Convert.ToBoolean(StringValue);
  • 3
    @Craig McMahon предлагает вместо этого использовать Integer: простые числа представляют истину, непростые числа представляют ложь
  • 13
    Я считаю это очень оскорбительным, @Berik. Очевидное решение состоит в том, чтобы отобразить слово «ИСТИНА» или «ЛОЖЬ» на изображении, а затем сохранить его в строке базы данных как BLOB-код в формате JPEG. Затем можно прочитать значение обратно, используя простой алгоритм извлечения признаков.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню