SQLiteの列タイプは柔軟(動的)であり、主に、他のデータベース管理システムで使用される固定列タイプの採用/適応に対応しているようです。
注意!このAsnwerは、奇妙で素晴らしい列タイプの使用を推奨していません。
1) 実際には、列タイプには事実上すべての名前を使用できますが、いくつかの制限があります。
2) 列タイプは、列定義の2番目の値です。例: CREATE TABLE table (columnname columntype .....,....)
、意図的にまたはおそらく不注意に省略される場合がありますが、注 5a)を参照してください。
3) 最初の制限は、mycolumn
INTEGER PRIMARY KEY
またはmycolumn
INTEGER PRIMARY KEY AUTOINCREMENT
特殊な列タイプです。この列は、 rowid
のエイリアスです。 これは一意の数値識別子です( AUTOINCREMENT
乱暴なというルールを課します テーブルに最後に使用されたROWIDよりも大きくする必要があります。行がID(9223372036854775807)を使用している場合、それ以降に行を追加しようとすると、SQLITEFULLエラーが発生します。 )。 SQLite自動インクリメント
4) その他の制限は、列タイプがSQLiteパーサーを混同してはならないことです。たとえば、列タイプがPRIMARY、TABLE、INDEXの場合、SQLite例外が発生します(構文エラー(コード1) )例: INDEXの列タイプが使用される場合:-
android.database.sqlite.SQLiteException: near "INDEX": syntax error (code 1):
発生します。
5) 列タイプは必須ではありません。たとえば、CREATE TABLE mytable (...,PRIMARY_COL,....
この場合、 PRAGMA TABLE_INFO(tablename)
タイプは表示されません。例: (3行目)。
08-08 07:56:23.391 13097-13097/? D/TBL_INFO: Col=cid Value=8
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=name Value=PRIMARY_COL
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=type Value=
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=notnull Value=1
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=dflt_value Value=null
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=pk Value=0
5a) 場合によっては、SQLiteパーサーは有効なキーワードにスキップします。 CREATE TABLE mytable (mycolumn NOT NULL,...
結果はNOT NULL
NOT NULL
を示すために使用されています 列とタイプ タイプなしと見なされます (上記のtable_infoは、実際にはそのような使用法からのものです。)
6) タイプは単一の単語に限定されません。 VARYING CHARACTER(255)
またはTHE BIG BAD WOLF
このtable_info抽出からわかるように、タイプとして指定できます:-
08-08 08:23:26.423 4799-4799/? D/ TBLINFO: Col=type Value=THE BIG BAD WOLF
SQLiteで非標準の列タイプを使用する理由!
要するに、いいえはありません 理由は、最初に述べたように、列タイプの柔軟性は、主に他のデータベース管理システムからのSQLの容易な適応に対応するためであるように思われます。
SQLiteが使用するストレージクラスとして決定した内容に従ってデータが保存されるため、列タイプ自体はほとんど効果がありません。 rowidを除いて ( 3を参照) 上記)任意の列は、任意のタイプの値を保持できます。
cursor.getBlob
を使用して取得する必要があるBlobとして保存されたデータを除きます。 そして、そのcursor.getBlobは、BLOBとして保存されていないデータには使用できません(getBlobは、TEXTとして保存されているデータで失敗しません)。cursor.get????
メソッド。
次にいくつかの例を示します。-
データがlong myINT = 556677888;
である列の場合 追加されます(ContentValuesを介して例:cv1.put(columnanme,myINT)
);
次に:-
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: Column=INTEGER_COL<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS INT >>556677888<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS LONG >>556677888<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS STRING >>556677888<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS DOUBLE >>5.56677888E8<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS FLOAT >>5.566779E8<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS SHORT >>15104<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: Unable to handle with getBlob.
getShortは保存された値に戻りません、getBlobは保存された値を取得できません。
Double myREAL = 213456789.4528791134567890109643534276;
の場合 :-
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: Column=REAL_COL<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS INT >>213456789<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS LONG >>213456789<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS STRING >>2.13457e+08<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS DOUBLE >>2.134567894528791E8<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS FLOAT >>2.1345678E8<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS SHORT >>6037<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: Unable to handle with getBlob.
String myTEXT = "The Lazy Quick Brown Fox Jumped Over the Fence or something like that.";
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: Column=TEXT_COL<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS INT >>0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS LONG >>0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS STRING >>The Lazy Quick Brown Fox Jumped Over the Fence or something like that.<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS DOUBLE >>0.0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS FLOAT >>0.0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS SHORT >>0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS BLOB >>[[email protected]<<
これは、列タイプがmy_char_is_not_a_char_but_an_int
の非常にばかげた例です。 PRAGMA TABLE_INFO
による :-
08-08 09:19:03.657 13575-13575/mjt.soqanda D/TBL_INFO: Col=cid Value=7
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ TBLINFO: Col=name Value=my_char_is_not_a_char_but_an_int_COL
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ TBLINFO: Col=type Value=my_char_is_not_a_char_but_an_int
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ TBLINFO: Col=notnull Value=0
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ TBLINFO: Col=dflt_value Value=null
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ TBLINFO: Col=pk Value=0
結果(上記の「Double」に従って保存)は次のとおりです。-
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: Column=my_char_is_not_a_char_but_an_int_COL<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: VALUE AS INT >>213456789<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: VALUE AS LONG >>213456789<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: VALUE AS STRING >>2.13457e+08<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: VALUE AS DOUBLE >>2.134567894528791E8<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: VALUE AS FLOAT >>2.1345678E8<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: VALUE AS SHORT >>6037<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: Unable to handle with getBlob.
上記は以下に基づいています。-SQLiteバージョン3のデータ型SQLite自動インクリメントPRAGMAステートメント
コードは、最小バージョン14およびターゲット26でコンパイルされたAPI22を実行するGenyMotionエミュレートデバイスでテスト/実行されました。