SQLite不是一個用於鏈接到大型數據庫服務器的客戶端,而是很是適合桌面程序和小型網站的數據庫服務器。SQLite直接讀寫在硬盤上的數據庫文件。html
SQlite3實現了絕大多數SQL92標準。整個數據庫存儲在一個單一的文件中,數據庫文件能夠在不一樣字節序的機器之間自由地共享,並支持最大可達2T的數據庫。linux
1、安裝git
下載 http://www.sqlite.org/sqlite-autoconf-3070500.tar.gzsql
一、PC機安裝shell
./configure數據庫
make編程
make install服務器
相關文件將在/usr/local生成函數
/usr/local/bin :可執行文件字體
/usr/local/include:頭文件
/usr/local/lib:庫文件
也能夠在configure時用prefix指定安裝目錄
二、交叉編譯(以freescale mpc8308爲例)
(1) ./configure --host=powerpc-e300c3-linux-gnu --prefix=/home/SQLite/build/
--prefix能夠隨意指定,只要方便使用。
(2) make&&make install
(3) 此時可使用file命令查看庫文件是否符合要求
如做者機器上顯示以下:
[wl_haanel@localhost sqlite-autoconf-3070500]$ file ../sqlite_build/lib/libsqlite3.so.0.8.6
../sqlite_build/lib/libsqlite3.so.0.8.6: ELF 32-bit MSB shared object, PowerPC or cisco 4500, version 1 (SYSV), not stripped
能夠看到libsqlite3.so的文件信息爲PowerPC
(4)此時生成的SQLite庫文件是還未strip過的,須要剝離調試信息
先看一下此時的文件大小:
[wl_haanel@localhost sqlite-autoconf-3070500]$ ls -al ../sqlite_build/lib/libsqlite3.so.0.8.6
-rwxr-xr-x 1 wl_haanel wl_haanel 1807102 03-08 14:51 ../sqlite_build/lib/libsqlite3.so.0.8.6
用strip進行剝離:
[wl_haanel@localhost sqlite-autoconf-3070500]$ powerpc-e300c3-linux-gnu-strip ../sqlite_build/lib/libsqlite3.so.0.8.6
再看一下文件大小:
[wl_haanel@localhost sqlite-autoconf-3070500]$ ls -al ../sqlite_build/lib/libsqlite3.so.0.8.6
-rwxr-xr-x 1 wl_haanel wl_haanel 601488 03-08 15:03 ../sqlite_build/lib/libsqlite3.so.0.8.6
差很少縮小2/3。
至此編譯就完成了。
2、開發板運行程序
把編譯目錄(configure參數prefix指定)的lib、bin、include目錄拷貝到開發板上,在開發板上指定LD_LIBRARY_PATH和PATH。在PC機上將程序進行交叉編譯,放到開發板上就能夠運行了。
3、sqlite3支持的數據類型
NULL
INTEGER
REAL
TEXT
BLOB
但實際上,sqlite3也接受以下的數據類型:
smallint 16 位元的整數。
interger 32 位元的整數。
decimal(p,s) p 精確值和 s 大小的十進位整數,精確值p是指所有有幾個數(digits)大小值,s是指小數點後有幾位數。若是沒有特別指定,則系統會設爲 p=5; s=0 。
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 包含了 年、月、日、時、分、秒、千分之一秒。
4、sqlite3命令
sqlite下除了特殊命令都要以分號 「;」 結尾,不然它將一直等待第一個分號的出現才判斷這條命令結束。
SQL語句直接輸入,屬於sqlite3自己的命令須要前面加 . 才能執行。
能夠在任什麼時候候輸入「.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 tbl1;
hello|10
goodbye|20
sqlite>
在「line"模式下,每個位於條記錄中的列在它本身那行顯示。每行由列名、一個等號和列數據組成。下一條記錄以一個空行隔開。這是一個行模式輸出的例子:
sqlite> .mode line
sqlite> select * from tbl1;
one = hello
two = 10
one = goodbye
two = 20
sqlite>
在列模式下,每條記錄在一個單獨的行中以數據列對齊的方式顯示。列如:
sqlite> .mode column
sqlite> select * from tbl1;
one two
---------- ----------
hello 10
goodbye 20
sqlite>
你能夠用「.separator」點命令來改變分界符。例如,爲了把分割符改成一個逗號和一個空格,你能夠這樣作:
sqlite> .separator ", "
sqlite> select * from tbl1;
hello, 10
goodbye, 20
sqlite>
在默認的狀況下,每列至少10個字符寬。太寬的數據將被截取。你能夠用「.width」命令來調整列寬。以下所示:
sqlite> .width 12 6
sqlite> select * from tbl1;
one two
------------ ------
hello 10
goodbye 20
sqlite>
上面例子中".width"命令設置第一列寬爲12第二列寬爲6。其它的列寬不變。你能夠指定與你查詢結果須要的列數同樣多的「.width」參數。
若是你指定一列寬爲0,那麼這個列寬將自動如下面三個數字中的最大值作爲列寬:十、表頭寬度和最寬的數據列的寬度。這可讓列自動調整寬度。每列的默認設置爲自動調整的0值。
出如今輸出開頭兩行的列標示能夠用".header"點命令關閉。在上面的例子中,列標示是打開的。能夠用下面的方法關閉列標示:
sqlite> .header off
sqlite> select * from tbl1;
hello 10
goodbye 20
sqlite>
另一個有用的輸出模式是"insert"。在插入模式下,被子格式化爲看起來像SQL INSERT語句的樣式。你能夠用插入模式來產生文件(便於)之後用於不一樣數據庫的輸入。
當指定插入模式時,你必須給定一個特定參數就是要插入的表名。例如:
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」。在這種模式下,sqlite3把查詢的結果寫作XHTML表。開始的<TABLE>和結束 的</TABLE>(標記)沒有寫出,但有<TR>、<TH>和<TD>等分界符。html輸出對 CGI來講是至關有用地。
把結果寫到文件中
默認狀況下,sqlte3把結送到標準輸出。你能夠用「.output」命令改變它。只須把輸出文件名作爲.output命令的輸出參數而後全部後續查詢結果將被寫到那個文件中。用「.output stdout」再一次改成標準輸出。例如:
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
$
查詢數據庫結構
sqlite3程序提供幾個有用的用於查詢數據庫結構的快捷命令。這些不是不能夠用別的方式來實現。這些命令僅僅是一個快捷方式而已。
例如,爲了查看數據庫的表列表,你能夠敲入「.tables」。
sqlite> .tables
tbl1
tbl2
sqlite>
「.tables」命令類似於設置列表模式而後執行接下來的查詢:
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的源代碼(能夠在源文件樹的src/shell.c中),你可找到上面的具體的查詢。「.indices」命令做用類 似的方式是列出特定表的全部的索引。「.indics」命令須一個參數即所要索引表的表名。最後,但不是至少,是「.schema」命令。不帶任何參 數,「.schema」命令顯示原始的用於建立當前數據庫的CREATE TABLE和CREATE INDEX語句。若是你給".schema"命令一個表名,它顯示原始的建立該表和它全部索引的CREATE語句。咱們能夠:sqlite> .schemacreate table tbl1(one varchar(10), two smallint)CREATE TABLE tbl2 ( f1 varchar(30) primary key, f2 text, f3 real)sqlite> .schema tbl2CREATE TABLE tbl2 ( f1 varchar(30) primary key, f2 text, f3 real)sqlite> ".schema"命令能夠用設置列表而後執行如下查詢來實現:
SELECT sql FROM
(SELECT * FROM sqlite_master UNION ALL
SELECT * FROM sqlite_temp_master)
WHERE type!='meta'
ORDER BY tbl_name, type DESC, name
.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 退出命令行接口
5、sqlite3編程
注意:在sqlite3的回調函數中,必定要有return 0,不要省略,不然回調函數只執行一次,不能將全部記錄掃描。
下面給出一個例子,包含了建立數據庫、表、插入、查詢、刪除操做
#include <stdio.h>#include <stdlib.h> //exit等函數的聲明#include "/home/wl_haanel/software/sqlite_build/include/sqlite3.h"int displaycb(void *para,int n_column,char **column_value,char **column_name);int inquire_Usecb(sqlite3 *db);int inquire_nocb(sqlite3 *db);int createTable(sqlite3 *db);int insertRecord(sqlite3 *db);int deleteRecord(sqlite3 *db);int displaycb(void *para,int n_column,char **column_value,char **column_name){ int i = 0; printf("Total column is %d/n",n_column); for(i = 0;i<n_column;i++) { printf("字段名: %s---->字段值:%s/n",column_name[i],column_value[i]); } printf("==========================/n"); return 0;}int inquire_Usecb(sqlite3 *db){ char *sql; char *zErrMsg; sql = "select * from 'SensorData';"; if(SQLITE_OK != sqlite3_exec(db,sql,displaycb,NULL,&zErrMsg)) { printf("operate failed: %s/n",zErrMsg); } return 0;}int inquire_nocb(sqlite3 *db){ int nrow = 0,ncolumn = 0; char **azResult=0; int i = 0; char *sql; char *zErrMsg; sql = "SELECT * FROM SensorData"; if(SQLITE_OK != sqlite3_get_table(db,sql,&azResult,&nrow,&ncolumn,&zErrMsg)) { printf("operate failed: %s/n",zErrMsg); } printf("row:%d column = %d/n",nrow,ncolumn); printf("The result of querying is :/n"); for ( i = 0;i < ( nrow + 1) * ncolumn; i++) printf("azResult[%d] = %s/n",i,azResult[i]); sqlite3_free_table(azResult); return 0;}//建立表函數int createnTable(sqlite3 *db){ char *zErrMsg = 0; char *sql = "CREATE TABLE SensorData(/ ID INTEGER PRIMARY KEY,/ SensorID INTEGER,/ SiteNum INTERER,/ Time VARCHAR(12),/ SensorParameter REAL / );"; if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)) { printf("operate failed: %s/n",zErrMsg); }}//插入數據函數int insertRecord(sqlite3 *db){ char *sql; char *zErrMsg; sql = "INSERT INTO 'SensorData' VALUES(NULL,1,1,'20100314',18.9);"; if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)) { printf("operate failed: %s/n",zErrMsg); } sql = "INSERT INTO 'SensorData' VALUES(NULL,1,1,'20100616',111);"; if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)) { printf("operate failed: %s/n",zErrMsg); } sql = "INSERT INTO 'SensorData' VALUES(NULL,1,1,'20110315',222);"; if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)) { printf("operate failed: %s/n",zErrMsg); }}//刪除數據函數int deleteRecord(sqlite3 *db){ char *sql; char *zErrMsg; char **azResult=0; int nrow = 0,ncolumn = 0; int i; sql = "DELETE FROM SensorData WHERE ID=1;"; if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)) { printf("operate failed: %s/n",zErrMsg); } sql = "SELECT * FROM SensorData;"; if(SQLITE_OK != sqlite3_get_table(db,sql,&azResult ,&nrow,&ncolumn,&zErrMsg)) { printf("operate failed: %s/n",zErrMsg); } printf("row:%d column:%d/n",nrow,ncolumn); printf("After deleting,the result of querying is :/n"); for(i=0;i<(nrow+1)*ncolumn;i++) printf("azResult[%d] = %s/n",i,azResult[i]); sqlite3_free_table(azResult);}int main(void){ sqlite3 *db = NULL; int rc; //打開指定的數據庫文件 rc = sqlite3_open("wldatabase.db",&db); if(rc) { fprintf(stderr,"can't open database: %s",sqlite3_errmsg(db)); sqlite3_close(db); exit(1); } else printf("You have opened a sqlite3 database successfully!/n"); createTable(db); insertRecord(db); //查詢 //使用sqlite3_get_table實現查詢 inquire_nocb(db); printf("ppppppppppppppppppppppppppppppppppp/n"); //使用回調函數實現查詢 inquire_Usecb(db); deleteRecord(db); sqlite3_close(db); return 0;}