SQLiteのBOOL値のタイプは何ですか?テーブルにTRUE / FALSE値を格納したい。
INTEGERの列を作成して、値0または1を格納できますが、これはBOOL型を実装するための最良の方法ではありません。
方法はありますか?
ありがとう。
SQLiteのBOOL値のタイプは何ですか?テーブルにTRUE / FALSE値を格納したい。
INTEGERの列を作成して、値0または1を格納できますが、これはBOOL型を実装するための最良の方法ではありません。
方法はありますか?
ありがとう。
回答:
SQLiteにはネイティブのブールデータ型はありません。データ型ドキュメントごと:
SQLiteには個別のブールストレージクラスはありません。代わりに、ブール値は整数0(false)および1(true)として格納されます。
SQLiteでは、整数0と1を使用してfalseとtrueを表すことができます。次のように列の型を宣言できます。
CREATE TABLE foo(mycolumn BOOLEAN NOT NULL CHECK (mycolumn IN (0,1)));
0と1に加えてNOT NULL
許可する場合は、を省略しますNULL
。
BOOLEAN
ここでの型名の使用は読みやすくするためです。SQLiteにとっては、NUMERICアフィニティを持つ型にすぎません。
SQLite 3.3.0(2006)以降、CHECK制約がサポートされていることに注意してください。
以下は、機能する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
SQLite ブールデータ型:
SQLiteには、別個のブールストレージクラスはありません。代わりに、ブール値は整数0(false)および1(true)として格納されます。
次の方法でブール値をintに変換できます。
int flag = (boolValue)? 1 : 0;
次のように、intを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を探索したい場合は、ここにチュートリアルがあります。ここで
1つの回答を示しました。彼らのために働いています。
Boolean flag2 = (intValue != 0);
値0および1の整数データ型を使用するのが最も高速です。
さらにエリクワの答え。CHECK制約は、TEXTデータ型を適用し、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ファイルのアクセス許可/モードのように、それらをすべて1つのintとして格納できます。
たとえばモード755の場合、各桁は異なるクラスのユーザー(所有者、グループ、パブリック)を参照します。各桁内で、4が読み取られ、2が書き込み、1が実行されるため、7はバイナリ111のようにそれらすべてすべてです。5が読み取られ、実行される101。独自のエンコード方式を構成します。
私は、Schedules DirectからTVスケジュールデータを格納するために何かを書いているだけで、バイナリフィールドまたはyes / noフィールドがあります。つまり、7ビット、つまり最大127の整数です。実際には1文字です。
私が今取り組んでいるものからのCの例。has()は、2番目の文字列が最初の文字列にある場合に1を返す関数です。inpは、この関数への入力文字列です。miscは、0に初期化された符号なしcharです。
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;
したがって、1つの整数に7つのブール値を格納し、さらに多くの領域を確保しています。
以下を使用して、上記の方程式を簡略化できます。
boolean flag = sqlInt != 0;
ブール値のint表現(sqlInt)が0(false)の場合、ブール値(フラグ)はfalseになり、それ以外の場合はtrueになります。
簡潔なコードは常に:)で作業するのに適しています
これを行う別の方法は、TEXT列です。次に、データベースから値を保存/読み取る前/後に、ブール値と文字列の間でブール値を変換します。
例 あなたが持って"boolValue = true;
いる
文字列に:
//convert to the string "TRUE"
string StringValue = boolValue.ToString;
そしてブール値に戻ります:
//convert the string back to boolean
bool Boolvalue = Convert.ToBoolean(StringValue);