Android SQLite3命令詳解教程
SQLite3可以讓我們手動的對SQLite數據庫進行管理。一共有2個sqlite3,一個在電腦上,它位于 android-sdk-windows\tools\sqlite3.exe,用于電腦上SQLite數據庫進行管理;還有一個位于Android系統上(手機上),它用于位于Android系統上的SQLite數據庫進行管理,對于后者你需要通過adb shell進入shell。有時我們不想直接在Android系統上對SQLite數據庫進行操作,這時可以把它拷貝到電腦上進行操作。
但是需要注意前者是Windows系統,后者是Linux系統,他們表示路徑的方式不一樣。
在SQLite3命令后可跟一個參數指定要打開或創建的數據庫文件。如果指定的數據庫文件還不存在,就會新建一個數據庫,且以該參數作為文件名。對于Android系統上的SQLite3,必須通過其shell來運行,如果新建數據庫的話,需要root權限,可以在shell中鍵入"su"來獲得root權限。
如果是Android系統的sqlite3程序(通過shell運行),你可以Ctrl鍵+D ,然后回車退出該程序回到shell,也可以Ctrl鍵+C直接退出Shell,如果是電腦上的SQLite3,可以Ctrl鍵+C直接退出SQLite3程序。
下面就是一個創建包含一個名叫"tbl1"的表的名叫"ex1"的SQLite數據庫的示例。
示例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"命令。
可以通過".help"命令來查看它所有的非SQL命令.所有不以"."為前綴的語句,都將做SQL進行解釋,當時對于SQL語句你需要在末尾加上分號";"以表示SQL語句輸入完成,這時你輸入的命令才開始按照SQL語言進行執行。
示例2:
java代碼:
- sqlite> CREATE TABLE tbl2 (
- ...> f1 varchar(30) primary key,
- ...> f2 text,
- ...> f3 real
- ...> );
- sqlite>
關于數據庫的schema是存放在一個叫sqlite_master的表中,你雖然不能對它進行DROP TABLE, UPDATE, INSERT or DELETE操作,但是可以像普通的表一樣對它進行查詢。
示例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中我們可以通過".help"命令來查所有的非SQL命令。
sqlite3 8種不同的方式顯示查詢返回的結果:"csv", "column", "html", "insert", "line", "list","tabs", "tcl".
你可以通過.mode來設置顯示的方式。默認的是"list"方式,這時返回結果的一條記錄顯示一行,每列的內容之間用設定的分隔符隔開,
默認的分隔符是"|".
示例5:
java代碼:
- sqlite> .mode list
- sqlite> select * from tbl1;
- hello|10
- goodbye|20
- sqlite>
你可以通過".separator"來設置"list"模式下的分隔符。比如我們想把", "作為分隔符,可以這樣:
示例6:
java代碼:
- sqlite> .separator ", "
- sqlite> select * from tbl1;
- hello, 10
- goodbye, 20
- sqlite>
"line"模式下, 每行只顯示數據庫的一行的一列。每行由列名,等號和列的值組成。每條記錄之間由一個空行隔開。
示例7
java代碼:
- sqlite> .mode line
- sqlite> select * from tbl1;
- one = hello
- two = 10
- one = goodbye
- two = 20
- sqlite>
"column"模式下,每條記錄都在單獨一行顯示。***行顯示的是列名,第二行只是用于分割列名和記錄的數據,第三行開始才是記錄的內容。
示例8:
java代碼:
- sqlite> .mode columnsqlite> select * from tbl1;
- one two
- ---------- ----------
- hello 10
- goodbye 20
- sqlite>
默認情況下,每列的寬度最多只能顯示10個字符。所以如果數據包含的字符如果他太多,可能就顯示不完。
但是我們可以通過".width"設置每列的寬度。
示例9:
java代碼:
- sqlite> .width 12 6
- sqlite> select * from tbl1;
- one two
- ------------ ------
- hello 10
- goodbye 20
- sqlite>
示例9就把第1列和第二列的寬度分別設置為了12和6個字符,其他列的寬度并沒改變。
如果你把列寬設置為0,那么調整為以下三個的***值:10,該列的列名字符數,***行記錄該列的字符數。這樣列的寬度就可以自動調整。
默認的列寬就是0,以便它可以自動調整。
可以通過".header"命令可以設置是否顯示頭(頭包括***行,列名,第二行,分隔行)。
示例10:
java代碼:
- sqlite> .header off
- sqlite> select * from tbl1;
- hello 10
- goodbye 20
- sqlite>
"insert"模式下,返回的查詢結果將以SQL的INSERT語句形式進行顯示。
示例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"模式下,查詢返回結果將以XHTML table的形式進行顯示,它并不以<TABLE>作為開頭和</TABLE>作為結尾。 但是每條記錄以<TR>作為開始,</TR>作為結束,記錄的數據以<TD>作為開始,以</TD>作為結束
示例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"命令可以把查詢返回結果的輸出定向到文件上。該命令的***個參數即是要定向的位置。在把輸出定向了文件后,可以通過".output stdout"把輸出重新定向到標準輸出上。
示例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提供了多個命令來查看數據庫的schema".tables"命令可以查看當前數據庫所有的表
示例14:
java代碼:
- sqlite> .tables
- tbl1
- tbl2
- sqlite>
".tables"和在list模式下執行下面的語句相似:
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 |
實際上, 如果你查看sqlite3程序的源碼 (found in the source tree in the file src/shell.c), you'll find exactly the above query.
另外,".tables"命令后也可以跟一參數,它是一個pattern,這樣命令就只列出表名和該參數匹配的表。
示例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(索引)。***個參數為表的名字。
示例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"命令,在沒有參數的情況,它會顯示最初用于創建數據庫的CREATE TABLE和CREATE INDEX的SQL語句。比如,示例16
".schema"命令可以包含一個參數,它是一個pattern,用于對表進行過濾,這時只會顯示滿足條件的表和所有索引的SQL語句。
比如,示例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>