手動建立數(shù)據(jù)庫
手動建立數(shù)據(jù)庫就是利用sqlite3工具,通過手工輸入SQL命令來完成建立數(shù)據(jù)庫的過程。這里來介紹一下sqlite3。sqlite3是SQLite數(shù)據(jù)庫自帶的一個SQL命令執(zhí)行工具,它基于命令行,并可以顯示命令執(zhí)行結果。sqlite3工具是被集成在Android系統(tǒng)中的,用戶在Linux的命令行界面中輸入sqlite3即可啟動sqlite3工具,并得到工具的版本信息,如代碼清單7-21所示。
代碼清單7-21 啟動sqlite3工具
# sqlite3
SQLite version
Enter ".help " for instructions
sqlite>
注意:啟動Linux的命令行界面的方法是在模擬器已經啟動的前提下,在CMD中輸入adb shell命令。
由上段代碼可以看出,在啟動sqlite3工具后,提示符從“#”變?yōu)椤皊qlite>”,表示命令行界面已經進入與SQLite數(shù)據(jù)庫的交互模式,此時可以輸入命令對數(shù)據(jù)庫的內容進行建立、刪除或修改。而正確退出sqlite3工具的方法是使用.exit命令。
代碼清單7-22 退出sqlite3工具
sqlite> .exit
#
原則上,每個應用程序的數(shù)據(jù)庫都保存在各自的/data/data//databases目錄下,但如果使用手工方式建立數(shù)據(jù)庫,則必須手工建立數(shù)據(jù)庫目錄,目前版本無須修改數(shù)據(jù)庫目錄的權限。
在SQLite數(shù)據(jù)庫中,每個數(shù)據(jù)庫保存在一個獨立的文件中,使用sqlite3工具后加文件名的方式打開數(shù)據(jù)庫文件,如果指定文件不存在,sqlite3工具則自動創(chuàng)建新文件。
代碼清單7-23所示的代碼將創(chuàng)建名為people的數(shù)據(jù)庫,在文件系統(tǒng)中將產生一個名為people.db的數(shù)據(jù)庫文件。
代碼清單7-23 創(chuàng)建名為people的數(shù)據(jù)庫
# sqlite3 people.db
SQLite version
Enter ".help " for instructions
sqlite>
代碼清單7-24所示的代碼在新創(chuàng)建的數(shù)據(jù)庫中,構造了一個名為peopleinfo的表,使用create table命令,關系模式為peopleinfo ( _id, name, age, height)。表包含4個屬性,_id是整型的主鍵;name表示姓名,數(shù)據(jù)類型為字符型,not null表示這個屬性一定要填寫,不可以為空值;age表示年齡,數(shù)據(jù)類型為整數(shù)型;height表示身高,數(shù)據(jù)類型為浮點型。
代碼清單7-24 創(chuàng)建名為peopleinfo的表
sqlite> create table peopleinfo
...> (_id integer primary key autoincrement,
...> name text not null,
...> age integer,
...> height float);
sqlite>
為了確認數(shù)據(jù)表是否創(chuàng)建成功,可以使用.tables命令,顯示當前數(shù)據(jù)庫中的所有表。從代碼清單7-25所示的代碼中可以觀察到,當前數(shù)據(jù)庫僅有一個名為peopleinfo的表。
代碼清單7-25 查看數(shù)據(jù)庫中表情況
sqlite> .tables
peopleinfo
sqlite>
當然,也可以使用.schema命令查看建立表時使用的SQL命令。如果當前數(shù)據(jù)庫中包含多個表,則可以使用[.schema 表名]的形式,顯示指定表的建立命令,如代碼清單7-26所示。
代碼清單7-26 查看數(shù)據(jù)庫中指定表的建立命令
sqlite>.schema
CREATE TABLE peopleinfo (_id integer primary key autoincrement,
name text not null, age integer, height float);
sqlite>
向peopleinfo表中添加數(shù)據(jù),使用insert into … values命令,如代碼清單7-27所示。
代碼清單7-27 向peopleinfo表中添加數(shù)據(jù)
sqlite> insert into peopleinfo values(null,'Tom',21,1.81);
sqlite> insert into peopleinfo values(null,'Jim',22,1.78);
sqlite> insert into peopleinfo values(null,'Lily',19,1.68);
sqlite> insert into peopleinfo values(null,'Lucy',21,1.68);
sqlite> insert into peopleinfo values(null,'John',21,1.86);
代碼運行成功后,數(shù)據(jù)庫的peopleinfo表將有3條數(shù)據(jù)。因為_id是自增加的主鍵,因此在輸入null后,SQLite數(shù)據(jù)庫會自動填寫該項的內容。終得到的表數(shù)據(jù)如表7-4所示。
表7-4 peopleinfo表數(shù)據(jù)
_id |
name |
age |
height |
1 |
Tom |
21 |
1.81 |
2 |
Jim |
22 |
1.78 |
3 |
Lily |
19 |
1.68 |
4 |
Lucy |
21 |
1.68 |
5 |
John |
21 |
1.86 |
在數(shù)據(jù)添加完畢后,使用select命令,顯示指定數(shù)據(jù)表中的所有數(shù)據(jù)信息,命令格式為[select 屬性 from 表名]。代碼清單7-28所示的代碼用來顯示peopleinfo表的所有數(shù)據(jù)。
代碼清單7-28 顯示peopleinfo表的所有數(shù)據(jù)
select * from peopleinfo;
1|Tom|21|1.81
2|Jim|22|1.78
3|Lily|19|1.68
4|Lucy|21|1.68
5|John|21|1.86
sqlite>
上面的查詢結果看起來不是非常直觀,可以使用mode命令將結果輸出格式更改為“表格”方式。
代碼清單7-29 以表格格式顯示peopleinfo表的所有數(shù)據(jù)
sqlite> .mode column
sqlite> select * from peopleinfo;
1 Tom 21 1.81
2 Jim 22 1.78
3 Lily 19 1.68
4 Lucy 21 1.68
5 John 21 1.86
sqlite>
注意:
mode命令除了支持常見的column格式外,還支持csv格式、html格式、insert格式、line格式、list格式、tabs格式和tcl格式。
更新數(shù)據(jù)可以使用update命令,命令格式為[update 表名 set 屬性=“新值” where 條件]。更新數(shù)據(jù)后,同樣使用select命令顯示數(shù)據(jù),則可以確定數(shù)據(jù)是否正確更新。
代碼清單7-30所示的代碼將姓名為Lily數(shù)據(jù)中的高度值更新為1.88。
代碼清單7-30 以表格格式顯示peopleinfo表更新后的數(shù)據(jù)
sqlite> update peopleinfo set height=1.88 where name='Lily';
sqlite> select * from peopleinfo;
select * from peopleinfo;
1 Tom 21 1.81
2 Jim 22 1.78
3 Lily 19 1.68
4 Lucy 21 1.68
5 John 21 1.86
sqlite>
刪除數(shù)據(jù)可以使用delete命令,命令格式為[delete from 表名where 條件]。代碼清單7-31所示的代碼將_id為3的數(shù)據(jù)從表peopleinfo中刪除。
代碼清單7-31 刪除數(shù)據(jù)
sqlite> delete from peopleinfo where _id=3;
sqlite> select * from peopleinfo;
select * from peopleinfo;
1 Tom 21 1.81
2 Jim 22 1.78
4 Lucy 21 1.68
5 John 21 1.86
sqlite>
sqlite3除了支持上述提到的增刪改查的數(shù)據(jù)庫操作外,對于復雜的查詢,例如,order by、group by,sum、count類的聚合函數(shù)等也支持。如代碼清單7-32、7-33所示。
代碼清單7-32 order by
sqlite> select * from peopleinfo order by height;
select * from peopleinfo order by height;
4 Lucy 21 1.68
2 Jim 22 1.78
1 Tom 21 1.81
5 John 21 1.86
sqlite>
代碼清單7-33 group by、count
sqlite> select age,count(_id) as count from peopleinfo group by age having count(_id)>1;
select * from peopleinfo order by height;
21 3
sqlite>
sqlite3工具還支持大量的命令,可以使用.help命令查詢sqlite3的命令列表。以下簡單介紹幾種命令,如表7-5所示。
表7-5 Sqlite3支持命令
編號 |
命令 |
說明 |
1 |
.bail ON|OFF |
遇到錯誤時停止,默認為OFF |
2 |
.databases |
顯示數(shù)據(jù)庫名稱和文件位置 |
3 |
.dump ?TABLE? ... |
將數(shù)據(jù)庫以SQL文本形式導出 |
4 |
.echo ON|OFF |
開啟和關閉回顯 |
5 |
.exit |
退出 |
6 |
.explain ON|OFF |
開啟或關閉適當輸出模式,如果開啟模式更改為column,并自動設置寬度 |
7 |
.header(s) ON|OFF |
開啟或關閉標題顯示 |
8 |
.help |
顯示幫助信息 |
9 |
.import FILE TABLE |
將數(shù)據(jù)從文件導入表中 |
10 |
.indices TABLE |
顯示表中所有列名 |
11 |
.load FILE ?ENTRY? |
導入擴展庫 |
12 |
.mode MODE ?TABLE? |
設置輸入格式 |
13 |
.nullvalue STRING |
打印時使用STRING代替NULL |
14 |
.output FILENAME |
將輸入保存到文件 |
15 |
.output stdout |
將輸入顯示在屏幕上 |
16 |
.prompt MAIN CONTINUE |
替換標準提示符 |
17 |
.quit |
退出 |
18 |
.read FILENAME |
在文件中執(zhí)行SQL語句 |
19 |
.schema ?TABLE? |
顯示表的創(chuàng)建語句 |
20 |
.separator STRING |
更改輸入和導入的分隔符 |
21 |
.show |
顯示當前設置變量值 |
22 |
.tables ?PATTERN? |
顯示符合匹配模式的表名 |
23 |
.timeout MS |
嘗試打開被鎖定的表ms(毫秒) |
24 |
.timer ON|OFF |
開啟或關閉CPU計時器 |
25 |
.width NUM NUM ... |
設置column模式的寬度 |