? SQLite是一個非常輕量級自包含(lightweight and self-contained)的DBMS,它可移植性好,很容易使用,很小,高效而且可靠。SQLite嵌入到使用它的應用程序中,它們共用相同的進程空間,而不是單獨的一個進程。從外部看,它并不像一個RDBMS,但在進程內部,它卻是完整的,自包含的數據庫引擎。
? ? ? ?嵌入式數據庫的一大好處就是在你的程序內部不需要網絡配置,也不需要管理。因為客戶端和服務器在同一進程空間運行。SQLite 的數據庫權限只依賴于文件系統,沒有用戶帳戶的概念。SQLite 有數據庫級鎖定,沒有網絡服務器。它需要的內存,其它開銷很小,適合用于嵌入式設備。你需要做的僅僅是把它正確的編譯到你的程序。
下面將介紹SQLite的使用:
一、創建SQLite數據庫
1、手工創建
? ? ? 使用sqlite3 工具,通過手工輸入SQL命令完成數據庫創建,用戶在Linux 的命令行界面中輸入 sqlite3 可啟動 sqlite3工具。
2、代碼創建
? ? ? ?在代碼中動態創建數據庫。
? ? ? ? 在程序執行過程中,當需要進行數據庫操作時,應用程序會首先嘗試打開數據庫,此時如果數據庫并不存在,程序會自動建立數據庫,然后打開數據庫。
二、SQLite常用命令介紹
1、sqlite3 指令(通常以 . 開頭)
1)創建或打開一個數據庫文件
? ? ? ?在終端下運行?sqlite3 < *.db > ?指令:
<*.db> 是要打開的數據庫文件。若該文件不存在,則自動創建。
2)顯示當前打開的數據庫文件
sqlite > .database
可以看到當前打開的數據庫文件正是剛剛建立的 message.db文件;
3)顯示數據庫中所有表名
sqlite > .tables
可以看到當前用戶下有一個名為 user 的表;
4)查看表的結構
sqlite > .schema <table_name>
其實這里顯示的正是我們創建新表時輸入的命令;
5)顯示所有命令
sqlite > .help
6) 退出 sqlite3
sqlite > .quit
2、SQL命令
? ? ? ?每個命令以 ;結束
1)創建新表
? ? ? sqlite > create table <table_name> (f1 type1, f2 type2,...);
type為數據類型:
NULL
INTEGER
REAL
TEXT
BLOB
注意:若未指定類型,默認是字符串,向表中添加新紀錄時要加 “”;
2)刪除表
?sqlite > drop table <table_name>;
可以看到原來有兩個表 user與user2 ,使用 drop ?table user2 后可以看到 只剩下 user;
3)查詢表中所有記錄
?sqlite >select * from <table_name>;
4) 按指定條件查詢表中記錄
sqlite >select * from <table_name> where <expression>;
這里的條件是 id < 2 ,可以看到 id < 3 的數據被挑選出來;
5)向表中添加新紀錄
sqlite >insert into <table_name> values(value1,value2,...);
可以看到最新的記錄被添加進去;
6)按指定的條件刪除表中記錄
sqlite >delete from <table_name> where <expression>;
可以看到 passwd=1 的被刪除;
7) 更新表中記錄
sqlite > updata <table_name> set <f1=value1>,<f2=value2>... where <expression>;
可以看到 id=3 的數據被更新。再次提醒,未定義類型的記錄默認是字符串,添加時一定要用“” ;
8)在表中添加字段
sqlite > alter table <table> add column <field><type> defalut... ;
可以看到 age 被添加進去;
三、SQLite 編程接口
1、打開sqlite 數據庫?sqlite3_open
函數原型:
[cpp] ?view plaincopy
int ?sqlite3_open( const ? char ?*fileName,?sqlite3?**ppDB);???
函數功能: 打開一個數據庫;若該數據庫文件不存在,則自動創建。打開或者創建數據庫的命令會被緩存,直到這個數據庫真正被調用的時候才會被執行。?
輸入參數:fileName ,待打開的數據庫文件名稱,包括路徑,以’\0’結尾;特別說明:SQLite支持內存數據庫,內存方式存儲使用文件名“:memory:”?
輸出參數 :ppDB, 返回打開的數據庫句柄;
返回值: 執行成功返回SQLITE_OK,否則返回其他值;
2、關閉 sqlite 數據庫sqlite3_close
?函數原型:
[cpp] ?view plaincopy
int ?sqlite3_close(sqlite3?*pDB);??
函數功能: 關閉一個打開的數據庫;
輸入參數: pDB,打開的數據庫句柄
輸出參數: 無?
返回值: 執行成功返回SQLITE_OK,否則返回其他值
3、sqlite3_errmsg
函數原型:
[cpp] ?view plaincopy
const ? char ?*sqlite3_errmsg(sqlite3?*pDB);??
函數功能: 獲取最近調用的API接口返回的錯誤說明,這些錯誤信息UTF-8的編碼返回,并且在下一次調用任何SQLiteAPI函數時被自動清除;
輸入參數 :pDB,打開的數據庫句柄
輸出參數: 無
返回值: 錯誤說明的字符串指針
4、sqlite3_exec
函數原型:
[cpp] ?view plaincopy
int ?sqlite3_exec(sqlite3?*pDB,constchar?*sql,?? ????????????????????sqlite_callback?callback,void ?*para, char ?**errMsg);??
函數功能:
編譯和執行零個或多個SQL語句,
查詢的結果返回給回調函數callback
輸入參數: pDB,數據庫句柄;sql,待執行的SQL語句字符串,以’\0’結尾;callback,回調函數,用來處理查詢結果,如果不需要回調(比如做insert或者delete操作時),可輸入NULL;para,用戶傳入的參數,可以為NULL,該參數指針最終會被傳給回調函數callback,供用戶在回調函數中使用;
輸出參數: errMsg,返回錯誤信息,注意是指針的指針。
返回值 :執行成功返回SQLITE_OK,否則返回其他值。
5、回調函數sqlite_callback 介紹
[cpp] ?view plaincopy
typedef ? int (*sqlite_callback)( void *para, int ?columnCount,?? ?????????????????????????????????char ?**columnValue, char ?**columnName);??
函數功能:
由用戶處理查詢的結果
[cpp] ?view plaincopy
回調函數的格式如下:?? int ?sqlite_callback(?? ????void *?pv,???? ?? ????int ?argc,???????? ?? ????char **?argv,???? ?? ????char **?col???????? ?? );?? ?? 參數格式:?? ????傳給sqlite3_exec的回調函數,用來顯示查詢結果?? ????對每一條查詢結果調用一次該回調函數?? 參數:?? ????pv:由sqlite3_exec傳遞的初始化參數?? ????argc:表頭的列數?? ????col:表頭的名字數組指針?? ????argv:表頭的數據數組指針?? 返回值:?? ????1:中斷查找?? ????0:繼續列舉查詢到的數據?? 示例表:?? +-----------------------------------+?? |??id??|??pic???|??data(16進制數據)??|?? |-----------------------------------|?? |???1??|??a.jpg?|??????00?00?00?...?|?? |-----------------------------------|?? |???2??|??b.jpg?|?????XX?XX?XX??????|?? +-----------------------------------+?? 對第一行數據:?? ????argc=3?即?[0]...[2]?? ????argv[0]="1" ,argv[1]= "a.jpg" ,argv[2]= "00?00?00..." (實際16進制數據,非這里顯示的字符串形式)?? ????col[0]="id" ,col[1]= "pic" ,col[2]= "data" ?? ??? 說明:?? ????sqlite3_exec()?的回調函數必須按照此格式,?當然形參的名字任意.?? ????如果某列的數據類型不是char *,?則可以對結果執行相關的轉換,?如:用atoi()把結果轉換為整數(integer),?如果是二進制數據,?則可以直接強制類型轉換,?如:( void *)argv[i].?? ????該回調函數有兩種返回值類型.?? ????????1.返回零:sqlite3_exec()?將繼續執行查詢.?? ????????2.返回非零:sqlite3_exec()將立即中斷查詢,?且?sqlite3_exec()?將返回?SQLITE_ABORT.?? 示例:?? ????int ?i;?? ????for (i=0;?i<argc;?i++)?? ????{?? ????????printf("%s\t%s\n\n" ,?col[i],?argv[i]);?? ????}??
下面是個實例:
[cpp] ?view plaincopy
#include?<sqlite3.h> ?? #include?<stdio.h> ?? #include?<stdlib.h> ?? #include?<string.h> ?? ?? #define?MAX?100 ?? ?? int ?show_sql_result(?? ????void ?*arg,??? ????int ?n_column,??? ????char ?**column_value,??? ????char ?**column_name?? ????)?? {?? ????int ?i?=?0;?? ?????? ????int ?param?=?*(( int ?*)arg);?? ?????? ????printf("enter?callback?--->?param?=?%d,?n_column?=?%d\n" ,?param,?n_column);?? ?????? ????for (i?=?0;?i?<?n_column;?i++)?{?? ????????printf("%s|" ,?column_name[i]);?? ????}?? ????printf("\b?\n" );?? ?????? ????for (i?=?0;?i?<?n_column;?i++)?{?? ????????printf("%s|" ,?column_value[i]);?? ????}?? ????printf("\b?\n" );?? ?????? ????return ?0;?? }?? ?? int ?exec_sql( char ?*sql_string,?sqlite3?*db)?? {?? ????char ?*errmsg?=?NULL;?? ?????? ????int ?param?=?100;?? ?????? ????printf("before?sqlite3_exec()\n" );?? ????if (?SQLITE_OK?!=?sqlite3_exec(?? ????????????db,??????? ????????????sql_string,??????? ????????????show_sql_result,??? ?????????????m,??????? ????????????&errmsg))?{?? ? ?? ????????if ?(NULL?!=?errmsg)?{?? ????????????fprintf(stderr,?"sqlite3_exec(%s):?%s.\n" ,??? ????????????????sql_string,?errmsg);?? ????????????sqlite3_free(errmsg);?? ????????}?? ????????else ?{?? ????????????fprintf(stderr,?"sqlite3_exec(%s):?error.\n" ,??? ????????????????sql_string);?? ????????}?? ????????return ?1;?? ????}?? ????printf("after?sqlite3_exec()\n" );?? ?????? ????return ?0;?? }?? ?? int ?main( int ?argc,? char ?*argv[])?? {?? ????sqlite3?*db?=?NULL;?? ????int ?result;?? ????char ?sql_buf[MAX];?? ?????? ????if ?(argc?<?2)?{?? ????????fprintf(stderr,?"usage?:?%s?<db?file>.\n" ,?argv[0]);?? ????????exit(EXIT_FAILURE);?? ????}?? ?????? ????result?=?sqlite3_open(argv[1],?&db);?? ????if ?(result?!=?SQLITE_OK)?{?? ????????if ?(NULL?!=?db)?{?? ????????????fprintf(stderr,?"sqlite3_open?%s?:?%s.\n" ,?? ????????????????argv[1],?sqlite3_errmsg(db));?? ????????}??? ????????else ?{?? ????????????printf("error?:?failed?to?allocate?memory?for?sqlite3!\n" );?? ????????}?? ?????????? ????????sqlite3_close(db);?? ?????????? ????????exit(EXIT_FAILURE);?? ????}?? ?????? ????while (1)?{?? ????????printf("sqlite>?" );?? ????????if ?(NULL?==?fgets(sql_buf,? sizeof (sql_buf),?stdin))?? ????????????continue ;?? ????????sql_buf[strlen(sql_buf)?-?1]?=?'\0' ;? ?? ?????????????????? ????????if (strncmp(sql_buf,? ".quit" ,?5)?==?0)?? ????????????break ;?? ?????????? ????????exec_sql(sql_buf,?db);?? ????}?? ?????? ????result?=?sqlite3_close(db);?? ????if ?(result?!=?SQLITE_OK)?{?? ????????fprintf(stderr,?"sqlite3_close?%s:?%s.\n" ,?? ????????????argv[1],?sqlite3_errmsg(db));?? ????????exit(EXIT_FAILURE);?? ????}?? ?????? ????exit(EXIT_SUCCESS);?? }??
編譯:
[cpp] ?view plaincopy
fs@ubuntu:~/qiang/SQLite/pro$?gcc?-o?test?demo2.c?-lsqlite3??
執行結果如下:
[cpp] ?view plaincopy
fs@ubuntu:~/qiang/SQLite$?./test?message.db??? sqlite>?select?*?from?user;?? before?sqlite3_exec()?? enter?callback?--->?param?=?100,?n_column?=?4?? id|name|num|age??? 1|Kobe|5|(null)??? enter?callback?--->?param?=?100,?n_column?=?4?? id|name|num|age??? 2|James|2|(null)??? enter?callback?--->?param?=?100,?n_column?=?4?? id|name|num|age??? 3|Jorden|6|(null)??? after?sqlite3_exec()?? sqlite>?update?user?set?age=36?where?id=1;?? before?sqlite3_exec()?? after?sqlite3_exec()?? sqlite>?select?*from?user?? before?sqlite3_exec()?? enter?callback?--->?param?=?100,?n_column?=?4?? id|name|num|age??? 1|Kobe|5|36??? enter?callback?--->?param?=?100,?n_column?=?4?? id|name|num|age??? 2|James|2|(null)??? enter?callback?--->?param?=?100,?n_column?=?4?? id|name|num|age??? 3|Jorden|6|(null)??? after?sqlite3_exec()?? sqlite>?.quit?? fs@ubuntu:~/qiang/SQLite$ ?
總結
以上是生活随笔 為你收集整理的嵌入式数据库 SQLite 浅析 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。