Os tipos de coluna SQLite são flexíveis (dinâmicos), principalmente, parecem atender à adoção/adaptação de tipos de coluna rígidos usados por outros sistemas de gerenciamento de banco de dados.
Observação! este Asnwer NÃO recomenda o uso de tipos de coluna estranhos e maravilhosos.
1) Na verdade, você pode usar praticamente qualquer nome para um tipo de coluna, no entanto, existem algumas limitações.
2) O tipo de coluna é o 2º valor na definição da coluna, por exemplo
CREATE TABLE table (columnname columntype .....,....)
, embora possa ser omitido intencionalmente ou talvez inadvertidamente Observação, consulte 5a) 3) A primeira limitação é que
mycolumn
CHAVE PRIMÁRIA INTEIRO
ou mycolumn
INCREMENTO AUTOMÁTICO DE CHAVE PRIMÁRIA INTEIRO
é um tipo de coluna especial. A coluna é um alias para o rowid
que é um identificador numérico exclusivo (AUTOINCREMENT
impõe uma regra que o rowid deve ser maior que o último rowid usado para a tabela, por exemplo. se uma linha usar id (9223372036854775807), qualquer tentativa subsequente de adicionar uma linha resultará em um erro SQLITE FULL. ). Autoincremento SQLite 4) Outras limitações são que o tipo de coluna não deve confundir o analisador SQLite. Por exemplo, um tipo de coluna PRIMARY, TABLE, INDEX resultará em uma exceção SQLite (erro de sintaxe (código 1) ) por exemplo. quando um tipo de coluna de INDEX é usado, então:-
android.database.sqlite.SQLiteException: near "INDEX": syntax error (code 1):
ocorre.
5) Um tipo de coluna não é obrigatório, por exemplo
CREATE TABLE mytable (...,PRIMARY_COL,....
nesse caso, um PRAGMA TABLE_INFO(tablename)
não mostrará nenhum tipo, por exemplo (3ª Linha). 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) Em alguns casos, o SQLite Parser pulará para PALAVRAS-CHAVE válidas, por exemplo.
CREATE TABLE mytable (mycolumn NOT NULL,...
resulta em NOT NULL
sendo usado para indicar um NOT NULL
coluna e o tipo sendo considerado como sem tipo (o table_info acima foi realmente de tal uso). 6) Um tipo não está limitado a uma única palavra, por exemplo
CARACTERES VARIADOS(255)
ou O LOBO RUIM
pode ser especificado como um tipo, como pode ser visto neste extrato table_info:- 08-08 08:23:26.423 4799-4799/? D/ TBLINFO: Col=type Value=THE BIG BAD WOLF
O motivo para usar tipos de coluna não padrão no SQLite!
Resumindo, não Por isso, como afirmado no início, a flexibilidade dos tipos de coluna parece ser principalmente para atender à fácil adaptação do SQL de outros sistemas de gerenciamento de banco de dados.
Os próprios tipos de coluna têm pouco efeito, pois os dados serão armazenados de acordo com o que o SQLite determina como a classe de armazenamento a ser usada. Com exceção de rowid (consulte 3) acima) qualquer coluna pode conter valores de qualquer tipo.
Com exceção dos dados armazenados como um Blob, que devem ser recuperados usando o
cursor.getBlob
e esse cursor.getBlob não pode ser usado para dados não armazenados como BLOB (getBlob não falha com dados armazenados como TEXT). .get???? métodos. Aqui estão alguns exemplos:-
Para uma coluna onde os dados
long myINT =556677888;
é adicionado (via ContentValues, por exemplo, cv1.put(columnanme,myINT)
); Então :-
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 não retorna ao valor armazenado, getBlob não pode obter o valor armazenado.
Para
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.
Para
String myTEXT ="A raposa marrom rápida e preguiçosa pulou a cerca ou algo assim.";
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]<<
E aqui está um exemplo bem ridículo com um tipo de coluna de
my_char_is_not_a_char_but_an_int
conforme 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
Os resultados (armazenados conforme 'Double' acima) são:-
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.
O acima foi baseado no seguinte:- Tipos de dados no SQLite versão 3 SQLite Autoincrement instruções PRAGMA
O código foi testado/executado em um dispositivo emulado GenyMotion executando API22 compilado com uma versão mínima de 14 e destino de 26.