日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

嵌入式数据库 SQLite 浅析

發布時間:2023/12/9 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌入式数据库 SQLite 浅析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? 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,????/*?由?sqlite3_exec()?的第四個參數傳遞而來?*/??
  • ????int?argc,????????/*?表的列數?*/??
  • ????char**?argv,????/*?指向查詢結果的指針數組,?可以由?sqlite3_column_text()?得到?*/??
  • ????char**?col????????/*?指向表頭名的指針數組,?可以由?sqlite3_column_name()?得到?*/??
  • );??
  • ??
  • 參數格式:??
  • ????傳給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,?????/*?handler?to?the?db?connection?*/??
  • ????????????sql_string,?????/*?SQL?statements?*/??
  • ????????????show_sql_result,/*?callback?*/???
  • ?????????????m,?????/*?param?to?the?callback?*/??
  • ????????????&errmsg))?{?/*?error?message?holder,??
  • ?????????????????????*?NULL?means?you?don't?want?it??
  • ?????????????????????*/??
  • ????????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';?/*?eat?up?the?ending?'\n'?*/??
  • ??????????????????
  • ????????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 浅析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。