android sqlite3詳解
SQLite庫包含一個名字叫做sqlite3的命令行,它可以讓用戶手工輸入并執(zhí)行面向SQLite數(shù)據(jù)庫的SQL命令。本文檔提供一個使用sqlite3命令的簡要說明。
啟動sqlite3程序,僅僅需要敲入帶有SQLite數(shù)據(jù)庫名字的"sqlite3"命令即可。如果文件不存在,則創(chuàng)建一個新的(數(shù)據(jù)庫)文件。然后sqlite3程序將提示你輸入SQL。敲入SQL語句(以分號“;”結束),敲回車鍵之后,SQL語句就會執(zhí)行。
例如,創(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>
復制代碼
你可以通過敲你所用系統(tǒng)的文件結束符(通常是Ctrl + D)或者中斷字符(通常是Ctrl + C),來終止sqlite3程序。確定你在每個SQL語句結束敲入分號!sqlite3程序通過查找分號來決定一個SQL語句的結束。如果你省略分號,sqlite3將給你一個連續(xù)的命令提示符并等你給當前的SQL命令添加更多的文字。這個特點讓你輸入多行的多個SQL語句,例如:
sqlite> create table tb_stu(
create table tb_stu(
...> id smallint,
...> name varchar(10)
...> );
);
復制代碼
題外話:查詢SQLITE_MASTER表
SQLite數(shù)據(jù)庫的表數(shù)據(jù)結構被保存在一個名叫"sqlite_master"的特殊的表中。你可以像查詢其它表一樣通過執(zhí)行“SELECT”查詢這個特殊的表。
sqlite> select * from sqlite_master;
table tb_stu tb_stu 2 CREATE TABLE tb_stu(id smallint,name varchar(10))
sqlite>
復制代碼
但你不能在sqlite_master表中執(zhí)行諸如DROP TABLE, UPDATE, INSERT 或者DELETE命令。sqlite_master表在你創(chuàng)建、刪除和索引數(shù)據(jù)庫時自動更新這個表。你不能手工更改sqlite_master表。
TEMPORARY表的結構沒有存儲在"sqlite_master"表中,由于TEMPORARY表對應用是不可見的,而不是應用程序創(chuàng)建這個表。 TEMPORARY表結構被存儲在另外一個名叫"sqlite_temp_master"的特定的表中。"sqlite_temp_master"表是臨時表自身。
sqlite3的特殊命令
大多數(shù)時候,sqlite3讀入輸入行,并把它們傳遞到SQLite庫中去運行。但是如果輸入行以一個點(“.”)開始,那么這行將被sqlite3程序自己截取并解釋。這些“點命令”通常被用來改變查詢輸出的格式,或者執(zhí)行鞭個預封包(預定義prepackaged)的查詢語句。
你可以在任何時候輸入“.help”,列出可用的點命令。例如
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程序可以以八種不同的格式顯示一個查詢的結果:"csv", "列", "html", "插入", "行", "制表"和"tcl"。你可以用".mode"點命令在這些輸出格式之間切換。
默認的輸出格式是“列表”。在列表模式下,每條查詢結果記錄被寫在一行中并且每列之間以一個字符串分割符隔開。默認的分隔符是一個管道符號(“|”)。列表符號在當你輸出查詢結果到另外一個符加處理的程序(如AWK)中去是尤為有用。
sqlite> .mode list
sqlite> select * from tb_stu;
1|zhangsan
2|lisi
sqlite>
復制代碼
你可以用“.separator”點命令來改變分界符。例如,為了把分割符改為一個逗號和一個空格,你可以這樣做:
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"模式下,每一個位于條記錄中的列在它自己那行顯示。每行由列名、一個等號和列數(shù)據(jù)組成。下一條記錄以一個空行隔開。這是一個行模式輸出的例子:
sqlite> .mode line
sqlite> select * from tb_stu;
id = 1
name = zhangsan
id = 2
name = lisi
sqlite>
復制代碼
在列模式下,每條記錄在一個單獨的行中以數(shù)據(jù)列對齊的方式顯示。列如:
sqlite> .mode column
sqlite> select * from tb_stu;
1 zhangsan
2 lisi
sqlite>
復制代碼
在默認的情況下,每列至少10個字符寬。太寬的數(shù)據(jù)將被截取。你可以用“.width”命令來調整列寬。如下所示:
--每一列列寬都為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。其它的列寬不變。你可以指定與你查詢結果需要的列數(shù)一樣多的“.width”參數(shù)。
如果你指定一列寬為0,那么這個列寬將自動以下面三個數(shù)字中的最大值做為列寬:10、表頭寬度和最寬的數(shù)據(jù)列的寬度。這可以讓列自動調整寬度。每列的默認設置為自動調整的0值。
出現(xiàn)在輸出開頭兩行的列標示可以用".header"點命令關閉。在上面的例子中,列標示是打開的。可以用下面的方法關閉列標示:
sqlite> .header off
sqlite> select * from tb_stu;
1 zhang
2 lisi
sqlite>
復制代碼
另外一個有用的輸出模式是"insert"。在插入模式下,被子格式化為看起來像SQL INSERT語句的樣式。你可以用插入模式來產(chǎn)生文件(便于)以后用于不同數(shù)據(jù)庫的輸入。
當指定插入模式時,你必須給定一個特定參數(shù)就是要插入的表名。例如:
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把查詢的結果寫做XHTML表。開始的<TABLE>和結束的</TABLE>(標記)沒有寫出,但有<TR>、<TH>和<TD>等分界符。html輸出對CGI來說是相當有用地。
把結果寫到文件中
默認情況下,sqlte3把結果送到標準輸出。你可以用“.output”命令改變它。只須把輸出文件名做為.output命令的輸出參數(shù)然后所有后續(xù)查詢結果將被寫到那個文件中。用“.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
復制代碼
查詢數(shù)據(jù)庫結構
sqlite3程序提供幾個有用的用于查詢數(shù)據(jù)庫結構的快捷命令。這些不是不可以用別的方式來實現(xiàn)。這些命令僅僅是一個快捷方式而已。
例如,為了查看數(shù)據(jù)庫的所有表,你可以敲入“.tables”。
“.tables”命令相似于設置列表模式然后執(zhí)行接下來的查詢:
.databases 列出數(shù)據(jù)庫文件名
.tables ?PATTERN? 列出?PATTERN?匹配的表名
.import FILE TABLE 將文件中的數(shù)據(jù)導入的文件中
.dump ?TABLE? 生成形成數(shù)據(jù)庫表的SQL腳本
.output FILENAME 將輸出導入到指定的文件中
.output stdout 將輸出打印到屏幕
.mode MODE ?TABLE? 設置數(shù)據(jù)輸出模式(csv,html,tcl…
.nullvalue STRING 用指定的串代替輸出的NULL串
.read FILENAME 執(zhí)行指定文件中的SQL語句
.schema ?TABLE? 打印創(chuàng)建數(shù)據(jù)庫表的SQL語句
.separator STRING 用指定的字符串代替字段分隔符
.show 打印所有SQLite環(huán)境變量的設置
.quit 退出命令行接口
數(shù)據(jù)類型
sqlite3對字段沒有嚴格要求,字段可以存儲任何類型數(shù)據(jù),它會適時的自動轉換,當然,你也可以創(chuàng)建表的時候對數(shù)據(jù)類型進行定義。
sqlite3包含null、integer、real、text、blob等數(shù)據(jù)類型,但實際上sqlite3也接收如下數(shù)據(jù)類型:
smallint 16位的整數(shù)。
interger 32位的整數(shù)。
decimal(p,s) 指定精度或對象能夠控制的數(shù)字個數(shù)。
p:小數(shù)點左邊和右邊數(shù)字之和,不包括小數(shù)點。如 123.45,則 p=5,s=2。
s:小數(shù)點右邊的位數(shù)或個數(shù)。
float 32位的浮點數(shù)。
double 64位的浮點數(shù)。
char(n) n長度的字符串,n不能超過254。
varchar(n) 長度不固定且其最大長度為n的字符串,n不能超過4000。
graphic(n) 和char(n)一樣,不過其單位是兩個字元double-bytes,n不能超過127。這個形態(tài)是為了支援兩個字節(jié)長度的字體,例如中文字。
vargraphic(n) 可變長度且其最大長度為n的雙字元字串,n不能超過2000
date 包含了 年份、月份、日期。
time 包含了 小時、分鐘、秒。
timestamp 包含了 年、月、日、時、分、秒、千分之一秒。
查看
.databases 顯示數(shù)據(jù)庫信息(好像.database也可以)
.tables 顯示所有表名(好像.table也可以)
.schema 查看所有表的數(shù)據(jù)結構;
.schema table_name 查看某表的數(shù)據(jù)結構
插入記錄
insert into table_name values (field1, field2, field3...);
查詢
select * from table_name;查看table_name表中所有記錄;
select * from table_name where field1='xxxxx'; 查詢符合指定條件的記錄;
刪除
drop table_name; 刪除表;
drop index_name; 刪除索引;
改變輸出格式
.mode list|column|insert|line|tabs|tcl|csv
.separator "," 更改分界符號為,
.width 5 每列寬度為5
更改輸出
.output file_name|stdout
接下來演示如何在android項目中操作數(shù)據(jù)庫?
1)、首先在myeclipse中新建一個android項目命名為testprj,并運行項目,目錄結構如下:
2)、操作數(shù)據(jù)庫,因為sqlite數(shù)據(jù)庫存放在/data/data/package/目錄下,我們可以通過cd命令進入/data/data/package/目錄下進行數(shù)據(jù)庫的操作:
adb shell #進入linux命令環(huán)境
cd /data/data/com.ljq.activity/ #進入/data/data/com.ljq.activity/目錄下
sqlite3 test.db #進入sqlite的操作環(huán)境,如果文件存在,則直接打開
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');