Android SQLite3命令詳解教程
SQLite3可以讓我們手動(dòng)的對(duì)SQLite數(shù)據(jù)庫(kù)進(jìn)行管理。一共有2個(gè)sqlite3,一個(gè)在電腦上,它位于 android-sdk-windows\tools\sqlite3.exe,用于電腦上SQLite數(shù)據(jù)庫(kù)進(jìn)行管理;還有一個(gè)位于Android系統(tǒng)上(手機(jī)上),它用于位于Android系統(tǒng)上的SQLite數(shù)據(jù)庫(kù)進(jìn)行管理,對(duì)于后者你需要通過(guò)adb shell進(jìn)入shell。有時(shí)我們不想直接在Android系統(tǒng)上對(duì)SQLite數(shù)據(jù)庫(kù)進(jìn)行操作,這時(shí)可以把它拷貝到電腦上進(jìn)行操作。
但是需要注意前者是Windows系統(tǒng),后者是Linux系統(tǒng),他們表示路徑的方式不一樣。
在SQLite3命令后可跟一個(gè)參數(shù)指定要打開(kāi)或創(chuàng)建的數(shù)據(jù)庫(kù)文件。如果指定的數(shù)據(jù)庫(kù)文件還不存在,就會(huì)新建一個(gè)數(shù)據(jù)庫(kù),且以該參數(shù)作為文件名。對(duì)于Android系統(tǒng)上的SQLite3,必須通過(guò)其shell來(lái)運(yùn)行,如果新建數(shù)據(jù)庫(kù)的話,需要root權(quán)限,可以在shell中鍵入"su"來(lái)獲得root權(quán)限。
如果是Android系統(tǒng)的sqlite3程序(通過(guò)shell運(yùn)行),你可以Ctrl鍵+D ,然后回車退出該程序回到shell,也可以Ctrl鍵+C直接退出Shell,如果是電腦上的SQLite3,可以Ctrl鍵+C直接退出SQLite3程序。
下面就是一個(gè)創(chuàng)建包含一個(gè)名叫"tbl1"的表的名叫"ex1"的SQLite數(shù)據(jù)庫(kù)的示例。
示例1:
java代碼:
- $ sqlite3 ex1
- SQLite version 3.3.10
- Enter ".help" for instructions
- sqlite> create table tbl1(one varchar(10), two smallint);
- sqlite> insert into tbl1 values('hello!',10);
- sqlite> insert into tbl1 values('goodbye', 20);
- sqlite> select * from tbl1;
- hello!|10
- goodbye|20
- sqlite>
SQLite3支持兩種命令,一種是SQL命令,一種是非SQL命令,非SQL命令以"."作為前綴,比如".tables"命令。
可以通過(guò)".help"命令來(lái)查看它所有的非SQL命令.所有不以"."為前綴的語(yǔ)句,都將做SQL進(jìn)行解釋,當(dāng)時(shí)對(duì)于SQL語(yǔ)句你需要在末尾加上分號(hào)";"以表示SQL語(yǔ)句輸入完成,這時(shí)你輸入的命令才開(kāi)始按照SQL語(yǔ)言進(jìn)行執(zhí)行。
示例2:
java代碼:
- sqlite> CREATE TABLE tbl2 (
- ...> f1 varchar(30) primary key,
- ...> f2 text,
- ...> f3 real
- ...> );
- sqlite>
關(guān)于數(shù)據(jù)庫(kù)的schema是存放在一個(gè)叫sqlite_master的表中,你雖然不能對(duì)它進(jìn)行DROP TABLE, UPDATE, INSERT or DELETE操作,但是可以像普通的表一樣對(duì)它進(jìn)行查詢。
示例3:
java代碼:
- sqlite3 /data/data/com.android.providers.settings/databases/settings.db
- SQLite version 3.6.22
- Enter ".help" for instructions
- Enter SQL statements terminated with a ";"
- sqlite> .tables
- .tables
- android_metadata bookmarks system
- bluetooth_devices secure
- sqlite> select * from sqlite_master;
- select * from sqlite_master;
- table|android_metadata|android_metadata|3|CREATE TABLE android_metadata (locale TEXT)
- table|system|system|4|CREATE TABLE system (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT UNIQUE ON CONFLICT REPLACE,value TEXT)
- index|sqlite_autoindex_system_1|system|5|
- table|sqlite_sequence|sqlite_sequence|6|CREATE TABLE sqlite_sequence(name,seq)
- index|systemIndex1|system|7|CREATE INDEX systemIndex1 ON system (name)
- table|secure|secure|8|CREATE TABLE secure (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT UNIQUE ON CONFLICT REPLACE,value TEXT)
- index|sqlite_autoindex_secure_1|secure|9|
- index|secureIndex1|secure|10|CREATE INDEX secureIndex1 ON secure (name)
- table|bluetooth_devices|bluetooth_devices|11|CREATE TABLE bluetooth_devices (_id INTEGER PRIMARY KEY,name TEXT,addr TEXT,channel INTEGER,type INTEGER)
- table|bookmarks|bookmarks|12|CREATE TABLE bookmarks (_id INTEGER PRIMARY KEY,tit
- le TEXT,folder TEXT,intent TEXT,shortcut INTEGER,ordering INTEGER)
- index|bookmarksIndex1|bookmarks|13|CREATE INDEX bookmarksIndex1 ON bookmarks (folder)
- index|bookmarksIndex2|bookmarks|14|CREATE INDEX bookmarksIndex2 ON bookmarks (shortcut)
- sqlite>
#p#
在sqlite3中我們可以通過(guò)".help"命令來(lái)查所有的非SQL命令。
sqlite3 8種不同的方式顯示查詢返回的結(jié)果:"csv", "column", "html", "insert", "line", "list","tabs", "tcl".
你可以通過(guò).mode來(lái)設(shè)置顯示的方式。默認(rèn)的是"list"方式,這時(shí)返回結(jié)果的一條記錄顯示一行,每列的內(nèi)容之間用設(shè)定的分隔符隔開(kāi),
默認(rèn)的分隔符是"|".
示例5:
java代碼:
- sqlite> .mode list
- sqlite> select * from tbl1;
- hello|10
- goodbye|20
- sqlite>
你可以通過(guò)".separator"來(lái)設(shè)置"list"模式下的分隔符。比如我們想把", "作為分隔符,可以這樣:
示例6:
java代碼:
- sqlite> .separator ", "
- sqlite> select * from tbl1;
- hello, 10
- goodbye, 20
- sqlite>
"line"模式下, 每行只顯示數(shù)據(jù)庫(kù)的一行的一列。每行由列名,等號(hào)和列的值組成。每條記錄之間由一個(gè)空行隔開(kāi)。
示例7
java代碼:
- sqlite> .mode line
- sqlite> select * from tbl1;
- one = hello
- two = 10
- one = goodbye
- two = 20
- sqlite>
"column"模式下,每條記錄都在單獨(dú)一行顯示。***行顯示的是列名,第二行只是用于分割列名和記錄的數(shù)據(jù),第三行開(kāi)始才是記錄的內(nèi)容。
示例8:
java代碼:
- sqlite> .mode columnsqlite> select * from tbl1;
- one two
- ---------- ----------
- hello 10
- goodbye 20
- sqlite>
默認(rèn)情況下,每列的寬度最多只能顯示10個(gè)字符。所以如果數(shù)據(jù)包含的字符如果他太多,可能就顯示不完。
但是我們可以通過(guò)".width"設(shè)置每列的寬度。
示例9:
java代碼:
- sqlite> .width 12 6
- sqlite> select * from tbl1;
- one two
- ------------ ------
- hello 10
- goodbye 20
- sqlite>
示例9就把第1列和第二列的寬度分別設(shè)置為了12和6個(gè)字符,其他列的寬度并沒(méi)改變。
如果你把列寬設(shè)置為0,那么調(diào)整為以下三個(gè)的***值:10,該列的列名字符數(shù),***行記錄該列的字符數(shù)。這樣列的寬度就可以自動(dòng)調(diào)整。
默認(rèn)的列寬就是0,以便它可以自動(dòng)調(diào)整。
可以通過(guò)".header"命令可以設(shè)置是否顯示頭(頭包括***行,列名,第二行,分隔行)。
示例10:
java代碼:
- sqlite> .header off
- sqlite> select * from tbl1;
- hello 10
- goodbye 20
- sqlite>
"insert"模式下,返回的查詢結(jié)果將以SQL的INSERT語(yǔ)句形式進(jìn)行顯示。
示例11:
java代碼:
- sqlite> .mode insert new_table
- sqlite> select * from tbl1;
- INSERT INTO 'new_table' VALUES('hello',10);
- INSERT INTO 'new_table' VALUES('goodbye',20);
- sqlite>
"html"模式下,查詢返回結(jié)果將以XHTML table的形式進(jìn)行顯示,它并不以<TABLE>作為開(kāi)頭和</TABLE>作為結(jié)尾。 但是每條記錄以<TR>作為開(kāi)始,</TR>作為結(jié)束,記錄的數(shù)據(jù)以<TD>作為開(kāi)始,以</TD>作為結(jié)束
示例12:
java代碼:
- sqlite> select * from system;
- select * from system;
- <TR><TD>1</TD>
- <TD>volume_music</TD>
- <TD>7</TD>
- </TR>
- <TR><TD>4</TD>
- <TD>volume_voice</TD>
- <TD>4</TD>
- </TR>
- sqlite>
".output"命令可以把查詢返回結(jié)果的輸出定向到文件上。該命令的***個(gè)參數(shù)即是要定向的位置。在把輸出定向了文件后,可以通過(guò)".output stdout"把輸出重新定向到標(biāo)準(zhǔn)輸出上。
示例13:
java代碼:
- sqlite> .mode list
- sqlite> .separator |
- sqlite> .output test_file_1.txt
- sqlite> select * from tbl1;
- sqlite> .exit
- $ cat test_file_1.txt
- hello|10
- goodbye|20
- $
#p#
sqlite3提供了多個(gè)命令來(lái)查看數(shù)據(jù)庫(kù)的schema".tables"命令可以查看當(dāng)前數(shù)據(jù)庫(kù)所有的表
示例14:
java代碼:
- sqlite> .tables
- tbl1
- tbl2
- sqlite>
".tables"和在list模式下執(zhí)行下面的語(yǔ)句相似:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%' UNION ALL SELECT name FROM sqlite_temp_master WHERE type IN ('table','view') ORDER BY 1 |
實(shí)際上, 如果你查看sqlite3程序的源碼 (found in the source tree in the file src/shell.c), you'll find exactly the above query.
另外,".tables"命令后也可以跟一參數(shù),它是一個(gè)pattern,這樣命令就只列出表名和該參數(shù)匹配的表。
示例14-1:
java代碼:
- sqlite> .tables
- .tables
- android_metadata bookmarks system
- bluetooth_devices secure
- sqlite> .tables s%
- .tables s%
- secure sqlite_sequence system
- sqlite>
".indices"命令列出指定表的所有indices(索引)。***個(gè)參數(shù)為表的名字。
示例15:
java代碼:
- sqlite> .schema system
- .schema system
- CREATE TABLE system (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT UNIQUE ON C
- ONFLICT REPLACE,value TEXT);
- CREATE INDEX systemIndex1 ON system (name);
- sqlite> .tables
- .tables
- android_metadata bookmarks system
- bluetooth_devices secure
- sqlite> .indices system
- .indices system
- sqlite_autoindex_system_1
- systemIndex1
- sqlite>
".schema"命令,在沒(méi)有參數(shù)的情況,它會(huì)顯示最初用于創(chuàng)建數(shù)據(jù)庫(kù)的CREATE TABLE和CREATE INDEX的SQL語(yǔ)句。比如,示例16
".schema"命令可以包含一個(gè)參數(shù),它是一個(gè)pattern,用于對(duì)表進(jìn)行過(guò)濾,這時(shí)只會(huì)顯示滿足條件的表和所有索引的SQL語(yǔ)句。
比如,示例15和示例17.
示例16:
java代碼:
- sqlite> .schema
- .schema
- CREATE TABLE android_metadata (locale TEXT);
- CREATE TABLE bluetooth_devices (_id INTEGER PRIMARY KEY,name TEXT,addr TEXT,chan
- nel INTEGER,type INTEGER);
- CREATE TABLE bookmarks (_id INTEGER PRIMARY KEY,title TEXT,folder TEXT,intent TE
- XT,shortcut INTEGER,ordering INTEGER);
- CREATE TABLE secure (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT UNIQUE ON C
- ONFLICT REPLACE,value TEXT);
- CREATE TABLE system (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT UNIQUE ON C
- ONFLICT REPLACE,value TEXT);
- CREATE INDEX bookmarksIndex1 ON bookmarks (folder);
- CREATE INDEX bookmarksIndex2 ON bookmarks (shortcut);
- CREATE INDEX secureIndex1 ON secure (name);
- CREATE INDEX systemIndex1 ON system (name);
- sqlite>
示例17:
java代碼:
- sqlite> .schema s%
- .schema s%
- CREATE TABLE secure (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT UNIQUE ON C
- ONFLICT REPLACE,value TEXT);
- CREATE TABLE sqlite_sequence(name,seq);
- CREATE TABLE system (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT UNIQUE ON C
- ONFLICT REPLACE,value TEXT);
- CREATE INDEX secureIndex1 ON secure (name);
- CREATE INDEX systemIndex1 ON system (name);
- sqlite>