Android Sqlite數據庫中Sqlite3命令的使用

SQLite庫包含一個名字叫做sqlite3的命令行,它可以讓用戶手工輸入並執行面向SQLite數據庫的SQL命令。本文檔提供一個使用sqlite3命令的簡要說明。 

SQLite3可以讓我們手動的對SQLite數據庫進行管理。一共有2個sqlite3,一個在電腦上,它位於 android-sdk-windows\tools\sqlite3.exe,用於電腦上SQLite數據庫進行管理;還有一個位於Android系統上(手機上),它用於位於Android系統上的SQLite數據庫進行管理,對於後者你需要通過adb shell進入shell。有時我們不想直接在Android系統上對SQLite數據庫進行操作,這時可以把它拷貝到電腦上進行操作。

但是需要注意前者是Windows系統,後者是Linux系統,他們表示路徑的方式不一樣


               啓動sqlite3程序,僅僅需要敲入帶有SQLite數據庫名字的"sqlite3"命令即可。如果文件不存在,則創建一個新的(數據庫)文件。然後sqlite3程序將提示你輸入SQL。敲入SQL語句(以分號“;”結束),敲回車鍵之後,SQL語句就會執行。 

例如,創建一張"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>                     

      你可以通過敲你所用系統的文件結束符(通常是Ctrl + D)或者中斷字符(通常是Ctrl + C),來終止sqlite3程序。確定你在每個SQL語句結束敲入分號!sqlite3程序通過查找分號來決定一個SQL語句的結束。如果你省略分號,sqlite3將給你一個連續的命令提示符並等你給當前的SQL命令添加更多的文字。這個特點讓你輸入多行的多個SQL語句,例如: 

sqlite> create table tb_stu( 
create table tb_stu( 
   ...> id smallint, 
   ...> name varchar(10) 
   ...> ); 
); 

                     
題外話:查詢SQLITE_MASTER表 
SQLite數據庫的表數據結構被保存在一個名叫"sqlite_master"的特殊的表中。你可以像查詢其它表一樣通過執行“SELECT”查詢這個特殊的表。 

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表在你創建、刪除和索引數據庫時自動更新這個表。你不能手工更改sqlite_master表。 

      TEMPORARY表的結構沒有存儲在"sqlite_master"表中,由於TEMPORARY表對應用是不可見的,而不是應用程序創建這個表。 TEMPORARY表結構被存儲在另外一個名叫"sqlite_temp_master"的特定的表中。"sqlite_temp_master"表是臨時表自身。 
         
sqlite3的特殊命令 :
大多數時候,sqlite3讀入輸入行,並把它們傳遞到SQLite庫中去運行。但是如果輸入行以一個點(“.”)開始,那麼這行將被sqlite3程序自己截取並解釋。這些“點命令”通常被用來改變查詢輸出的格式,或者執行鞭個預封包(預定義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> 
          

在“line"模式下,每一個位於條記錄中的列在它自己那行顯示。每行由列名、一個等號和列數據組成。下一條記錄以一個空行隔開。這是一個行模式輸出的例子: 
複製代碼 

sqlite> .mode line 
sqlite> select * from tb_stu; 
   id = 1 
name = zhangsan 

   id = 2 
name = lisi 
sqlite> 
         
在列模式下,每條記錄在一個單獨的行中以數據列對齊的方式顯示。列如: 

sqlite> .mode column 
sqlite> select * from tb_stu; 
1      zhangsan 
2      lisi 
sqlite> 

在默認的情況下,每列至少10個字符寬。太寬的數據將被截取。你可以用“.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。其它的列寬不變。你可以指定與你查詢結果需要的列數一樣多的“.width”參數。 

如果你指定一列寬爲0,那麼這個列寬將自動以下面三個數字中的最大值做爲列寬:10、表頭寬度和最寬的數據列的寬度。這可以讓列自動調整寬度。每列的默認設置爲自動調整的0值。 
          
出現在輸出開頭兩行的列標示可以用".header"點命令關閉。在上面的例子中,列標示是打開的。可以用下面的方法關閉列標示: 

sqlite> .header off 
sqlite> select * from tb_stu; 
1             zhang 
2             lisi 
sqlite> 

             

另外一個有用的輸出模式是"insert"。在插入模式下,被子格式化爲看起來像SQL INSERT語句的樣式。你可以用插入模式來產生文件(便於)以後用於不同數據庫的輸入。 

當指定插入模式時,你必須給定一個特定參數就是要插入的表名。例如: 

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命令的輸出參數然後所有後續查詢結果將被寫到那個文件中。用“.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 
         
查詢數據庫結構 
sqlite3程序提供幾個有用的用於查詢數據庫結構的快捷命令。這些不是不可以用別的方式來實現。這些命令僅僅是一個快捷方式而已。 
例如,爲了查看數據庫的所有表,你可以敲入“.tables”。 
        
“.tables”命令相似於設置列表模式然後執行接下來的查詢: 
.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語句 
.schema ?TABLE? 打印創建數據庫表的SQL語句 
.separator STRING 用指定的字符串代替字段分隔符 
.show 打印所有SQLite環境變量的設置 
.quit 退出命令行接口        

數據類型 

sqlite3對字段沒有嚴格要求,字段可以存儲任何類型數據,它會適時的自動轉換,當然,你也可以創建表的時候對數據類型進行定義。 
sqlite3包含null、integer、real、text、blob等數據類型,但實際上sqlite3也接收如下數據類型: 
smallint 16位的整數。 
interger 32位的整數。 
decimal(p,s) 指定精度或對象能夠控制的數字個數。 
p:小數點左邊和右邊數字之和,不包括小數點。如 123.45,則 p=5,s=2。 
s:小數點右邊的位數或個數。 
float 32位的浮點數。 
double 64位的浮點數。 
char(n) n長度的字符串,n不能超過254。 
varchar(n) 長度不固定且其最大長度爲n的字符串,n不能超過4000。 
graphic(n) 和char(n)一樣,不過其單位是兩個字元double-bytes,n不能超過127。這個形態是爲了支援兩個字節長度的字體,例如中文字。 
vargraphic(n) 可變長度且其最大長度爲n的雙字元字串,n不能超過2000 
date 包含了 年份、月份、日期。 
time 包含了 小時、分鐘、秒。 
timestamp 包含了 年、月、日、時、分、秒、千分之一秒。 
            
查看 
.databases 顯示數據庫信息(好像.database也可以) 
.tables 顯示所有表名(好像.table也可以) 
.schema 查看所有表的數據結構; 
.schema table_name 查看某表的數據結構 
插入記錄 
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項目中操作數據庫? 
1)、首先在myeclipse中新建一個android項目命名爲testprj,並運行項目; 
2)、操作數據庫,因爲sqlite數據庫存放在/data/data/package/目錄下,我們可以通過cd命令進入/data/data/package/目錄下進行數據庫的操作: 
adb shell #進入linux命令環境 
cd /data/data/com.ljq.activity/ #進入/data/data/com.ljq.activity/目錄下 
sqlite3 test.db #進入sqlite的操作環境,如果文件存在,則直接打開 
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');

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章