Typy kolumn SQLite są elastyczne (dynamiczne), przede wszystkim wydaje się, że pozwalają na przyjęcie/adaptację sztywnych typów kolumn używanych przez inne systemy zarządzania bazami danych.
Uwaga! ta odpowiedź NIE zaleca używania dziwnych i wspaniałych typów kolumn.
1) Właściwie możesz użyć praktycznie dowolnej nazwy dla typu kolumny, istnieją jednak pewne ograniczenia.
2) Typ kolumny to druga wartość w definicji kolumny, np. CREATE TABLE tabela (typ kolumny nazwa kolumny .....,....)
, chociaż może być pominięty celowo lub być może nieumyślnie Uwaga:patrz 5a)
3) Pierwszym ograniczeniem jest to, że mojakolumna
KLUCZ PODSTAWOWY CAŁKOWITY
lub mojakolumna
CAŁKOWITY AUTOMATYCZNY WZROST KLUCZA PODSTAWOWEGO
to specjalny typ kolumny. Kolumna jest aliasem dla rowid
który jest unikalnym identyfikatorem numerycznym (AUTOINCREMENT
narzuca regułę, że rowid musi być większy niż ostatnio użyty wiersz w tabeli, np. jeśli wiersz używa identyfikatora (9223372036854775807), każda kolejna próba dodania wiersza spowoduje błąd SQLITE FULL. ). Autoinkrementacja SQLite
4) Inne ograniczenia polegają na tym, że typ kolumny nie może mylić parsera SQLite. Na przykład typ kolumny PRIMARY, TABLE, INDEX spowoduje wystąpienie wyjątku SQLite (błąd składni (kod 1) ) np. gdy używany jest typ kolumny INDEX, to:-
android.database.sqlite.SQLiteException: near "INDEX": syntax error (code 1):
wystąpi.
5) Typ kolumny nie jest obowiązkowy, na przykład CREATE TABLE mojatabela (...,PRIMARY_COL,....
w takim przypadku PRAGMA TABLE_INFO(nazwa tabeli)
nie pokaże żadnego typu, np. (3. linia).
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) W niektórych przypadkach Parser SQLite przeskoczy do prawidłowych SŁÓW KLUCZOWYCH, np. CREATE TABLE mojatabela (mojakolumna NOT NULL,...
wyniki w NOT NULL
używany do wskazania NOT NULL
kolumna i typ brane jako bez typu (powyższy table_info pochodzi z takiego użycia).
6) Typ nie jest ograniczony do jednego słowa, np. RÓŻNE ZNAKI(255)
lub WIELKI ZŁY WILK
można określić jako typ, jak widać z tego wyciągu table_info :-
08-08 08:23:26.423 4799-4799/? D/ TBLINFO: Col=type Value=THE BIG BAD WOLF
Powód używania niestandardowych typów kolumn w SQLite!
Krótko mówiąc, nie ma nie powód, jak stwierdzono na początku, elastyczność typów kolumn wydaje się służyć przede wszystkim łatwej adaptacji SQL z innych systemów zarządzania bazami danych.
Same typy kolumn mają niewielki wpływ, ponieważ dane będą przechowywane zgodnie z tym, co SQLite określa jako używaną klasę pamięci. Z wyjątkiem rowid (patrz 3) powyżej) każda kolumna może zawierać wartości dowolnego typu.
Z wyjątkiem danych przechowywanych jako obiekty Blob, które należy pobrać za pomocą cursor.getBlob
i ten kursor.getBlob nie może być użyty do danych, które nie są przechowywane jako BLOB (getBlob nie zawodzi z danymi przechowywanymi jako TEKST). .get???? metody.
Oto kilka przykładów:-
Dla kolumny, w której dane long myINT =556677888;
jest dodany (poprzez ContentValues, np. cv1.put(columnanme,myINT)
);
Wtedy :-
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 nie powraca do przechowywanej wartości, getBlob nie może pobrać przechowywanej wartości.
Dla 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 ="Leniwy, szybki brązowy lis przeskoczył przez płot lub coś w tym stylu.";
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]<<
A oto dość śmieszny przykład z typem kolumny my_char_is_not_a_char_but_an_int
zgodnie z 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
Wyniki (przechowywane zgodnie z 'Double' powyżej) to:-
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.
Powyższe zostało oparte na następujących:Typy danych w SQLite Wersja 3 SQLite Autoincrement Wypowiedzi PRAGMA
Kod został przetestowany/uruchomiony na emulowanym urządzeniu GenyMotion z interfejsem API22 skompilowanym z minimalną wersją 14 i celem 26.