Các loại cột SQLite rất linh hoạt (động), về cơ bản, nó dường như phục vụ cho việc chấp nhận / thích ứng với các loại cột cứng nhắc được sử dụng bởi các Hệ thống quản lý cơ sở dữ liệu khác.
Lưu ý! Asnwer này KHÔNG khuyến nghị sử dụng các loại cột kỳ lạ và tuyệt vời.
1) Bạn thực sự có thể sử dụng hầu như bất kỳ tên nào cho một loại cột, tuy nhiên vẫn có một số hạn chế.
2) Loại cột là giá trị thứ 2 trong định nghĩa cột, ví dụ:CREATE TABLE table (columnname columntype .....,....)
, mặc dù nó có thể bị bỏ qua một cách cố ý hoặc có thể vô tình Lưu ý xem 5a)
3) Hạn chế đầu tiên là mycolumn
INTEGER PRIMARY KEY
hoặc mycolumn
INTEGER PRIMARY KEY AUTOINCREMENT
là một loại cột đặc biệt. Cột là bí danh cho rowid
là một định danh số duy nhất ( AUTOINCREMENT
áp đặt quy tắc rowid phải lớn hơn rowid được sử dụng gần đây nhất cho bảng, ví dụ:nếu một hàng sử dụng id (9223372036854775807), thì bất kỳ nỗ lực nào tiếp theo để thêm một hàng sẽ dẫn đến lỗi SQLITE FULL. ). SQLite Autoincrement
4) Các hạn chế khác là kiểu cột không được nhầm lẫn với trình phân tích cú pháp SQLite. Ví dụ:loại cột CHÍNH, TABLE, INDEX sẽ dẫn đến ngoại lệ SQLite ( lỗi cú pháp (mã 1) ) ví dụ. khi một loại cột INDEX được sử dụng thì:-
android.database.sqlite.SQLiteException: near "INDEX": syntax error (code 1):
xảy ra.
5) Loại cột là không bắt buộc, ví dụ:CREATE TABLE mytable (...,PRIMARY_COL,....
trong trường hợp đó thì một PRAGMA TABLE_INFO(tablename)
sẽ không hiển thị loại ví dụ:(Dòng thứ 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) Trong một số trường hợp, Trình phân tích cú pháp SQLite sẽ bỏ qua KEYWORDS hợp lệ, ví dụ:CREATE TABLE mytable (mycolumn NOT NULL,...
kết quả là NOT NULL
được sử dụng để chỉ ra một NOT NULL
và loại được coi là không có loại (table_info ở trên thực sự là từ cách sử dụng như vậy).
6) Một loại không giới hạn ở một từ đơn lẻ, ví dụ: VARYING CHARACTER(255)
hoặc THE BIG BAD WOLF
có thể được chỉ định là một loại có thể được nhìn thấy từ trích xuất table_info này:-
08-08 08:23:26.423 4799-4799/? D/ TBLINFO: Col=type Value=THE BIG BAD WOLF
Lý do sử dụng các kiểu cột không chuẩn trong SQLite!
Tóm lại là có không lý do, như đã nêu lúc đầu, tính linh hoạt của các loại cột dường như chủ yếu để phục vụ cho việc thích ứng dễ dàng SQL từ các Hệ thống quản lý cơ sở dữ liệu khác.
Bản thân các kiểu cột có ít ảnh hưởng vì dữ liệu sẽ được lưu trữ theo những gì SQLite xác định là lớp lưu trữ sẽ được sử dụng. Ngoại trừ rowid (xem 3) ở trên) bất kỳ cột nào cũng có thể chứa các giá trị thuộc bất kỳ loại nào.
Ngoại trừ dữ liệu được lưu trữ dưới dạng Blob, dữ liệu này phải được truy xuất bằng cursor.getBlob
và cursor.getBlob không thể được sử dụng cho dữ liệu không được lưu trữ dưới dạng BLOB (getBlob không thất bại với dữ liệu được lưu trữ dưới dạng TEXT), Bạn rất có thể truy xuất dữ liệu (tất cả đều không nhất thiết phải hữu ích) bằng bất kỳ con trỏ nào trong số cursor.get????
các phương pháp.
Dưới đây là một số ví dụ:-
Đối với cột có dữ liệu long myINT = 556677888;
được thêm vào (thông qua ContentValues, ví dụ:cv1.put(columnanme,myINT)
);
Sau đó:-
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 không trả về giá trị được lưu trữ, getBlob không thể nhận được giá trị được lưu trữ.
Đối với 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.
Đối với 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]<<
Và đây là một ví dụ khá nực cười với loại cột là my_char_is_not_a_char_but_an_int
theo 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
Kết quả (được lưu trữ theo 'Double' ở trên) là:-
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.
Ở trên dựa trên những điều sau:-Datypes Trong SQLite Phiên bản 3 Câu lệnh PRAGMA SQLite Autoincrement
Mã đã được thử nghiệm / chạy trên thiết bị mô phỏng GenyMotion chạy API22 được biên dịch với phiên bản tối thiểu là 14 và mục tiêu là 26.