android sqlite3詳解
SQLite庫包含一個(gè)名字叫做sqlite3的命令行,它可以讓用戶(hù)手工輸入并執行面向SQLite數據庫的SQL命令。本文檔提供一個(gè)使用sqlite3命令的簡(jiǎn)要說(shuō)明。
啟動(dòng)sqlite3程序,僅僅需要敲入帶有SQLite數據庫名字的"sqlite3"命令即可。如果文件不存在,則創(chuàng )建一個(gè)新的(數據庫)文件。然后sqlite3程序將提示你輸入SQL。敲入SQL語(yǔ)句(以分號“;”結束),敲回車(chē)鍵之后,SQL語(yǔ)句就會(huì )執行。
例如,創(chuàng )建一張"tb11"表,你可以這樣做:
C:\Users\Administrator>adb shell
# sqlite3
SQLite version 3.5.9
Enter ".help" for instructions
sqlite> create table tb_stu(id smallint,name varchar(10));
sqlite> insert into tb_stu values(1,'zhangsan');
sqlite> insert into tb_stu values (2,'lisi');
sqlite> .mode column
sqlite> .width 10
sqlite> select * from tb_stu;
1 zhangsan
2 lisi
sqlite>
復制代碼
你可以通過(guò)敲你所用系統的文件結束符(通常是Ctrl + D)或者中斷字符(通常是Ctrl + C),來(lái)終止sqlite3程序。確定你在每個(gè)SQL語(yǔ)句結束敲入分號!sqlite3程序通過(guò)查找分號來(lái)決定一個(gè)SQL語(yǔ)句的結束。如果你省略分號,sqlite3將給你一個(gè)連續的命令提示符并等你給當前的SQL命令添加更多的文字。這個(gè)特點(diǎn)讓你輸入多行的多個(gè)SQL語(yǔ)句,例如:
sqlite> create table tb_stu(
create table tb_stu(
...> id smallint,
...> name varchar(10)
...> );
);
復制代碼
題外話(huà):查詢(xún)SQLITE_MASTER表
SQLite數據庫的表數據結構被保存在一個(gè)名叫"sqlite_master"的特殊的表中。你可以像查詢(xún)其它表一樣通過(guò)執行“SELECT”查詢(xún)這個(gè)特殊的表。
sqlite> select * from sqlite_master;
table tb_stu tb_stu 2 CREATE TABLE tb_stu(id smallint,name varchar(10))
sqlite>
復制代碼
但你不能在sqlite_master表中執行諸如DROP TABLE, UPDATE, INSERT 或者DELETE命令。sqlite_master表在你創(chuàng )建、刪除和索引數據庫時(shí)自動(dòng)更新這個(gè)表。你不能手工更改sqlite_master表。
TEMPORARY表的結構沒(méi)有存儲在"sqlite_master"表中,由于TEMPORARY表對應用是不可見(jiàn)的,而不是應用程序創(chuàng )建這個(gè)表。 TEMPORARY表結構被存儲在另外一個(gè)名叫"sqlite_temp_master"的特定的表中。"sqlite_temp_master"表是臨時(shí)表自身。
sqlite3的特殊命令
大多數時(shí)候,sqlite3讀入輸入行,并把它們傳遞到SQLite庫中去運行。但是如果輸入行以一個(gè)點(diǎn)(“.”)開(kāi)始,那么這行將被sqlite3程序自己截取并解釋。這些“點(diǎn)命令”通常被用來(lái)改變查詢(xún)輸出的格式,或者執行鞭個(gè)預封包(預定義prepackaged)的查詢(xún)語(yǔ)句。
你可以在任何時(shí)候輸入“.help”,列出可用的點(diǎn)命令。例如
sqlite> .help
.bail ON|OFF Stop after hitting an error. Default OFF
.databases List names and files of attached databases
.dump ?TABLE? ... Dump the database in an SQL text format
.echo ON|OFF Turn command echo on or off
.exit Exit this program
.explain ON|OFF Turn output mode suitable for EXPLAIN on or off.
.header(s) ON|OFF Turn display of headers on or off
.help Show this message
.import FILE TABLE Import data from FILE into TABLE
.indices TABLE Show names of all indices on TABLE
.load FILE ?ENTRY? Load an extension library
.mode MODE ?TABLE? Set output mode where MODE is one of:
csv Comma-separated values
column Left-aligned columns. (See .width)
html HTML <table> code
insert SQL insert statements for TABLE
line One value per line
list Values delimited by .separator string
tabs Tab-separated values
tcl TCL list elements
.nullvalue STRING Print STRING in place of NULL values
.output FILENAME Send output to FILENAME
.output stdout Send output to the screen
.prompt MAIN CONTINUE Replace the standard prompts
.quit Exit this program
.read FILENAME Execute SQL in FILENAME
.schema ?TABLE? Show the CREATE statements
.separator STRING Change separator used by output mode and .import
.show Show the current values for various settings
.tables ?PATTERN? List names of tables matching a LIKE pattern
.timeout MS Try opening locked tables for MS milliseconds
.width NUM NUM ... Set column widths for "column" mode
sqlite>
復制代碼
改變輸出格式
sqlite3程序可以以八種不同的格式顯示一個(gè)查詢(xún)的結果:"csv", "列", "html", "插入", "行", "制表"和"tcl"。你可以用".mode"點(diǎn)命令在這些輸出格式之間切換。
默認的輸出格式是“列表”。在列表模式下,每條查詢(xún)結果記錄被寫(xiě)在一行中并且每列之間以一個(gè)字符串分割符隔開(kāi)。默認的分隔符是一個(gè)管道符號(“|”)。列表符號在當你輸出查詢(xún)結果到另外一個(gè)符加處理的程序(如AWK)中去是尤為有用。
sqlite> .mode list
sqlite> select * from tb_stu;
1|zhangsan
2|lisi
sqlite>
復制代碼
你可以用“.separator”點(diǎn)命令來(lái)改變分界符。例如,為了把分割符改為一個(gè)逗號和一個(gè)空格,你可以這樣做:
sqlite> .separator ''
sqlite> select * from tb_stu;
1 zhangsan
2 lisi
sqlite>
或者
sqlite> .separator ','
sqlite> select * from tb_stu;
1,zhangsan
2,lisi
sqlite>
復制代碼
在“l(fā)ine"模式下,每一個(gè)位于條記錄中的列在它自己那行顯示。每行由列名、一個(gè)等號和列數據組成。下一條記錄以一個(gè)空行隔開(kāi)。這是一個(gè)行模式輸出的例子:
sqlite> .mode line
sqlite> select * from tb_stu;
id = 1
name = zhangsan
id = 2
name = lisi
sqlite>
復制代碼
在列模式下,每條記錄在一個(gè)單獨的行中以數據列對齊的方式顯示。列如:
sqlite> .mode column
sqlite> select * from tb_stu;
1 zhangsan
2 lisi
sqlite>
復制代碼
在默認的情況下,每列至少10個(gè)字符寬。太寬的數據將被截取。你可以用“.width”命令來(lái)調整列寬。如下所示:
--每一列列寬都為10
sqlite> .width 10
sqlite> select * from tb_stu;
1 zhangsan
2 lisi
sqlite>
--設置第一列寬為12第二列寬為6。其它的列寬不變
sqlite> .width 12 6
sqlite> select * from tb_stu;
1 zhangsan
2 lisi
sqlite>
復制代碼
上面例子中".width"命令設置第一列寬為12第二列寬為6。其它的列寬不變。你可以指定與你查詢(xún)結果需要的列數一樣多的“.width”參數。
如果你指定一列寬為0,那么這個(gè)列寬將自動(dòng)以下面三個(gè)數字中的最大值做為列寬:10、表頭寬度和最寬的數據列的寬度。這可以讓列自動(dòng)調整寬度。每列的默認設置為自動(dòng)調整的0值。
出現在輸出開(kāi)頭兩行的列標示可以用".header"點(diǎn)命令關(guān)閉。在上面的例子中,列標示是打開(kāi)的??梢杂孟旅娴姆椒P(guān)閉列標示:
sqlite> .header off
sqlite> select * from tb_stu;
1 zhang
2 lisi
sqlite>
復制代碼
另外一個(gè)有用的輸出模式是"insert"。在插入模式下,被子格式化為看起來(lái)像SQL INSERT語(yǔ)句的樣式。你可以用插入模式來(lái)產(chǎn)生文件(便于)以后用于不同數據庫的輸入。
當指定插入模式時(shí),你必須給定一個(gè)特定參數就是要插入的表名。例如:
sqlite> .mode insert tb_stu_temp
sqlite> select * from tb_stu;
INSERT INTO tb_stu_temp VALUES(1,'zhangsan');
INSERT INTO tb_stu_temp VALUES(2,'lisi');
sqlite>
復制代碼
最新的輸出格式是“html”。在這種模式下,sqlite3把查詢(xún)的結果寫(xiě)做XHTML表。開(kāi)始的<TABLE>和結束的</TABLE>(標記)沒(méi)有寫(xiě)出,但有<TR>、<TH>和<TD>等分界符。html輸出對CGI來(lái)說(shuō)是相當有用地。
把結果寫(xiě)到文件中
默認情況下,sqlte3把結果送到標準輸出。你可以用“.output”命令改變它。只須把輸出文件名做為.output命令的輸出參數然后所有后續查詢(xún)結果將被寫(xiě)到那個(gè)文件中。用“.output stdout”再一次改為標準輸出。例如:
sqlite> .separator |
sqlite> .output tb_stu_temp.txt
sqlite> select * from tb_stu;
sqlite> .exit
# cat tb_stu_temp.txt
hello|10
goodbye|20
復制代碼
查詢(xún)數據庫結構
sqlite3程序提供幾個(gè)有用的用于查詢(xún)數據庫結構的快捷命令。這些不是不可以用別的方式來(lái)實(shí)現。這些命令僅僅是一個(gè)快捷方式而已。
例如,為了查看數據庫的所有表,你可以敲入“.tables”。
“.tables”命令相似于設置列表模式然后執行接下來(lái)的查詢(xún):
.databases 列出數據庫文件名
.tables ?PATTERN? 列出?PATTERN?匹配的表名
.import FILE TABLE 將文件中的數據導入的文件中
.dump ?TABLE? 生成形成數據庫表的SQL腳本
.output FILENAME 將輸出導入到指定的文件中
.output stdout 將輸出打印到屏幕
.mode MODE ?TABLE? 設置數據輸出模式(csv,html,tcl…
.nullvalue STRING 用指定的串代替輸出的NULL串
.read FILENAME 執行指定文件中的SQL語(yǔ)句
.schema ?TABLE? 打印創(chuàng )建數據庫表的SQL語(yǔ)句
.separator STRING 用指定的字符串代替字段分隔符
.show 打印所有SQLite環(huán)境變量的設置
.quit 退出命令行接口
數據類(lèi)型
sqlite3對字段沒(méi)有嚴格要求,字段可以存儲任何類(lèi)型數據,它會(huì )適時(shí)的自動(dòng)轉換,當然,你也可以創(chuàng )建表的時(shí)候對數據類(lèi)型進(jìn)行定義。
sqlite3包含null、integer、real、text、blob等數據類(lèi)型,但實(shí)際上sqlite3也接收如下數據類(lèi)型:
smallint 16位的整數。
interger 32位的整數。
decimal(p,s) 指定精度或對象能夠控制的數字個(gè)數。
p:小數點(diǎn)左邊和右邊數字之和,不包括小數點(diǎn)。如 123.45,則 p=5,s=2。
s:小數點(diǎn)右邊的位數或個(gè)數。
float 32位的浮點(diǎn)數。
double 64位的浮點(diǎn)數。
char(n) n長(cháng)度的字符串,n不能超過(guò)254。
varchar(n) 長(cháng)度不固定且其最大長(cháng)度為n的字符串,n不能超過(guò)4000。
graphic(n) 和char(n)一樣,不過(guò)其單位是兩個(gè)字元double-bytes,n不能超過(guò)127。這個(gè)形態(tài)是為了支援兩個(gè)字節長(cháng)度的字體,例如中文字。
vargraphic(n) 可變長(cháng)度且其最大長(cháng)度為n的雙字元字串,n不能超過(guò)2000
date 包含了 年份、月份、日期。
time 包含了 小時(shí)、分鐘、秒。
timestamp 包含了 年、月、日、時(shí)、分、秒、千分之一秒。
查看
.databases 顯示數據庫信息(好像.database也可以)
.tables 顯示所有表名(好像.table也可以)
.schema 查看所有表的數據結構;
.schema table_name 查看某表的數據結構
插入記錄
insert into table_name values (field1, field2, field3...);
查詢(xún)
select * from table_name;查看table_name表中所有記錄;
select * from table_name where field1='xxxxx'; 查詢(xún)符合指定條件的記錄;
刪除
drop table_name; 刪除表;
drop index_name; 刪除索引;
改變輸出格式
.mode list|column|insert|line|tabs|tcl|csv
.separator "," 更改分界符號為,
.width 5 每列寬度為5
更改輸出
.output file_name|stdout
接下來(lái)演示如何在android項目中操作數據庫?
1)、首先在myeclipse中新建一個(gè)android項目命名為testprj,并運行項目,目錄結構如下:
2)、操作數據庫,因為sqlite數據庫存放在/data/data/package/目錄下,我們可以通過(guò)cd命令進(jìn)入/data/data/package/目錄下進(jìn)行數據庫的操作:
adb shell #進(jìn)入linux命令環(huán)境
cd /data/data/com.ljq.activity/ #進(jìn)入/data/data/com.ljq.activity/目錄下
sqlite3 test.db #進(jìn)入sqlite的操作環(huán)境,如果文件存在,則直接打開(kāi)
create table tb_stu(id smallint,name varchar(20),pwd varchar(6)) #新建一張tb_stu表
insert into tb_stu values (1, 'zhangsan', '123456');
insert into tb_stu values (2, 'lisi', '123456');
聯(lián)系客服