Jenis kolom SQLite fleksibel (dinamis), terutama, tampaknya memenuhi adopsi/adaptasi jenis kolom kaku yang digunakan oleh Sistem Manajemen basis data lainnya.
Perhatikan! Jawaban ini TIDAK merekomendasikan penggunaan jenis kolom yang aneh dan indah.
1) Anda sebenarnya dapat menggunakan hampir semua nama untuk jenis kolom, namun ada beberapa batasan.
2) Jenis kolom adalah nilai ke-2 dalam definisi kolom mis. CREATE TABLE table (columnname columntype .....,....)
, meskipun mungkin dihilangkan dengan sengaja atau mungkin tidak sengaja Catatan lihat 5a)
3) Batasan pertama adalah mycolumn
INTEGER PRIMARY KEY
atau mycolumn
INTEGER PRIMARY KEY AUTOINCREMENT
adalah jenis kolom khusus. Kolom adalah alias untuk rowid
yang merupakan pengidentifikasi numerik unik (AUTOINCREMENT
memberlakukan aturan bahwa rowid harus lebih besar dari rowid yang terakhir digunakan untuk tabel mis. jika sebuah baris menggunakan id (9223372036854775807), maka setiap upaya berikutnya untuk menambahkan baris akan menghasilkan kesalahan SQLITE FULL. ). Peningkatan Otomatis SQLite
4) Keterbatasan lainnya adalah bahwa jenis kolom tidak boleh membingungkan pengurai SQLite. Misalnya jenis kolom PRIMARY, TABLE, INDEX akan menghasilkan pengecualian SQLite (kesalahan sintaks (kode 1) ) misalnya ketika jenis kolom INDEX digunakan maka:-
android.database.sqlite.SQLiteException: near "INDEX": syntax error (code 1):
terjadi.
5) Jenis kolom tidak wajib, misalnya CREATE TABLE mytable (...,PRIMARY_COL,....
dalam hal ini PRAGMA TABLE_INFO(tablename)
tidak akan menunjukkan tipe mis. (Baris ke-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) Dalam beberapa kasus, Parser SQLite akan melompat ke KATA KUNCI yang valid mis. CREATE TABLE mytable (mycolumn NOT NULL,...
menghasilkan NOT NULL
digunakan untuk menunjukkan NOT NULL
kolom dan jenis dianggap sebagai tidak ada tipe (tabel_info di atas sebenarnya dari penggunaan seperti itu).
6) Jenis tidak terbatas pada satu kata, mis. VARYING CHARACTER(255)
atau THE BIG BAD WOLF
dapat ditentukan sebagai tipe seperti yang dapat dilihat dari ekstrak table_info ini :-
08-08 08:23:26.423 4799-4799/? D/ TBLINFO: Col=type Value=THE BIG BAD WOLF
Alasan untuk menggunakan tipe kolom non-standar di SQLite!
Singkatnya tidak ada tidak alasan, seperti yang dinyatakan di awal, fleksibilitas jenis kolom tampaknya terutama untuk memenuhi adaptasi SQL yang mudah dari Sistem Manajemen Basis Data lainnya.
Jenis kolom sendiri tidak banyak berpengaruh karena data akan disimpan sesuai dengan apa yang ditentukan SQLite sebagai kelas penyimpanan yang akan digunakan. Dengan pengecualian rowid (lihat 3) di atas) kolom apa pun dapat menampung nilai jenis apa pun.
Dengan pengecualian data yang disimpan sebagai Blob, yang harus diambil menggunakan cursor.getBlob
dan cursor.getBlob itu tidak dapat digunakan untuk data yang tidak disimpan sebagai BLOB (getBlob tidak gagal dengan data yang disimpan sebagai TEXT), Anda dapat mengambil banyak data (semuanya belum tentu berguna) menggunakan salah satu cursor.get????
metode.
Berikut beberapa contohnya:-
Untuk kolom dimana data long myINT = 556677888;
ditambahkan (melalui ContentValues mis. cv1.put(columnanme,myINT)
);
Kemudian :-
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 tidak mengembalikan nilai yang disimpan, getBlob tidak bisa mendapatkan nilai yang disimpan.
Untuk 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.
For 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]<<
Dan inilah contoh yang cukup konyol dengan jenis kolom my_char_is_not_a_char_but_an_int
sesuai 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
Hasil (disimpan sesuai 'Ganda' di atas) adalah:-
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.
Di atas didasarkan pada yang berikut:-Tipe data Dalam SQLite Versi 3 Pernyataan PRAGMA SQLite Autoincrement
Kode diuji/dijalankan pada perangkat emulasi GenyMotion yang menjalankan API22 yang dikompilasi dengan versi minimum 14 dan target 26.