在SQLite中存储布尔值

SQLite中BOOL值的types是什么? 我想在我的表中存储TRUE / FALSE值。

我可以创build一个INTEGER列并存储值0或1,但它不会是实现BOOLtypes的最佳方法。

有没有办法?

谢谢。

SQLite没有本地布尔数据types。 根据数据typesdoc :

SQLite没有单独的布尔存储类。 相反,布尔值被存储为整数0(假)和1(真)。

SQLite 布尔值数据types:
SQLite没有单独的布尔存储类。 相反,布尔值被存储为整数0(假)和1(真)。

你可以用这种方式将boolean转换为int:

int flag = (boolValue)? 1 : 0; 

您可以将int转换回布尔值,如下所示:

  // 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, 这是一个教程 。
我在这里给出了一个答案。 它正在为他们工作。

在SQLite中,最好的办法是使用整数0和1来表示错误和真实。 你可以像这样声明列types:

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

除了0和1之外,如果要允许NULL ,则省略NOT NULL

在这里使用BOOLEANtypes是为了便于阅读,对于SQLite来说,它只是一个具有NUMERIC关系的types。

请注意,自SQLite 3.3.0 (2006)以来,支持CHECK约束 。

下面是一些可以工作的示例INSERT:(注意string和浮点数如何被parsing为整数)

 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 

在其他情况下,使用defaultcheck是非常有用的:

 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只允许整数零或整数,值确实不能为空 。 所以在这种情况下:

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

简单地被禁止 ,他们不能发生,并会导致错误。

使用值为0和1的Integer数据types是最快的。

关于埃里克瓦的回答。 CHECK约束可以通过强制TEXT数据types来启用伪布尔列,并且只允许TRUE或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 

但是,如果你想存储一堆他们你可以位移他们和存储他们全部为一个整数,有点像UNIX文件的权限/模式。

例如,对于755模式,每个数字指的是不同的用户类别:所有者,组,公共。 在每个数字内读取4个,2个写入,1个执行所以7个都像二进制111. 5个读取和执行所以101.组成你自己的编码scheme。

我只是写一些东西来存储Schedule Scheduler的电视节目表数据,我有二进制或是/否的字段:立体声,高清晰度电视,新的,ei,字幕,杜比,西class牙语,赛季首映。 所以7位,或者是一个最大值为127的整数。

从我现在正在工作的AC例子。 has()是一个函数,如果第二个string在第一个string中,则返回1。 inp是此函数的inputstring。 misc是一个初始化为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个布尔值存储在一个整数中,并且有更多空间。

您可以使用以下方法简化上述公式:

 boolean flag = sqlInt != 0; 

如果布尔的int表示(sqlInt)为0(false),则布尔(标志)将为false,否则为true。

简洁的代码总是比较好用:)

UPDATE表SET Boolcolumn ='1'WHERE ……

另一种方法是TEXT列。 然后在保存/读取数据库中的值之前/之后,将布尔值和string之间的布尔值进行转换。

防爆。 你有"boolValue = true;

string:

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

回到布尔:

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