Sqlite3入門學習(一)
Linux環境下sqlite3的安裝及常用Linux API說明
- 環境安裝
Step1:一般的linux可能會自帶sqlite,在安裝之前先使用sqlite3命令檢測一下,若顯示并未安裝,則進行下述操作
Step2:先到 https://www.sqlite.org/download.html ,下載sqlite-autoconf-*.tar.gz壓縮包
Step3:下載完了,把壓縮包放進Linux系統中,放在Ubuntu的桌面,然后解壓
Step4:進入解壓后路徑接著執行命令./configure --prefix=/usr/local 表示安裝至usr/local路徑下;
Step5: 接著執行命令 make
Step6: 最后執行命令make install
Step7:執行命令sqlite3,檢測是否安裝成功,如下圖所示表示安裝成功
- 常用Linux API說明
- sqlite3_open
int sqlite3_open(const char* fileName, sqlite3** ppDB);
函數功能:打開一個數據庫;若該數據庫文件不存在,則自動創建。打開或者創建數據庫的命令會被緩存,直到這個數據庫真正被調用的時候才會被執行。
輸入參數:fileName,待打開的數據庫文件名稱,包括路徑,以'\0'結尾;
特別說明:SQLite 支持內存數據庫,內存方式存儲使用文件名":memory:"
輸出參數:ppDB,返回打開的數據庫句柄;
返回值:執行成功返回SQLITE_OK,否則返回其他值;
-
- sqlite3_close
int sqlite3_close(sqlite3* pDB);
函數功能:關閉一個打開的數據庫;
輸入參數:pDB,打開的數據庫句柄
輸出參數: 無
返回值:執行成功返回SQLITE_OK,否則返回其他值
-
- sqlite3_exec
函數功能:編譯和執行零個或多個SQL 語句,查詢的結果返回給回調函數callback
int sqlite3_exec(sqlite3* pDB, const char *sql, sqlite_callback callback, void*para, char** errMsg);
輸入參數:
pDB:數據庫句柄;
sql:待執行的SQL 語句字符串,以'\0'結尾;
callback:回調函數,用來處理查詢結果,可以輸入NULL;
para:傳入的參數,可以為NULL,該參數被傳給回調函數callback調用;
輸出參數:errMsg,返回錯誤信息,注意是指針的指針。
返回值:執行成功返回SQLITE_OK,否則返回其他值
-
- sqlite3_busy_handle()
int sqlite3_busy_handle(sqlite3*, int(*)(void *, int), void *);
第一個參數:當你調用sqlite_busy_handle函數時傳遞給它的一個void*的參數的拷貝;
第二個參數是因此這次鎖事件,該回調函數被調用的次數。
如果回調函數返回0時,將不再嘗試再次訪問數據庫而返回SQLITE_BUSY或者SQLITE_IOERR_BLOCKED。
如果回調函數返回非0, 將會不斷嘗試操作數據庫。
詳細說明:程序運行過程中,如果有其他進程或者線程在讀寫數據庫,那么sqlite3_busy_handler會不斷調用回調函數,直到其他進程或者線程釋放鎖。獲得鎖之后,不會再調用回調函數,從而向下執行,進行數據庫其他操作
-
- sqlite3_get_table()
此函數接受sql中的SQL語句返回的所有記錄,使用堆上聲明的內存(使用sqlite3_malloc())將所有記錄存儲在參數char*** pazResult中。必須使用sqlite3_table_free()函數釋放內存
該函數將char ***pazResult指針作為唯一的參數。pazResult中的第一個記錄其實并不是記錄,而且結果集中列的名稱。
int sqlite3_get_table(
sqlite3 *db, //打開的數據庫的句柄
const char *zSql, //要執行的SQL語句
char ***pazResult, //結果寫入該指針指向的char***
int *pnRow, //結果集中行的數目
int *pnColumn, //結果集中列的數目
char **pzErrmsg //錯誤信息
);
第2個參數是sql 語句,跟sqlite3_exec 里的sql 是一樣的。是一個很普通的以\0結尾的char*字符串。
第3個參數是查詢結果,它依然一維數組,它內存布局是:字段名稱,后面是緊接著是每個字段的值。第4個參數是查詢出多少條記錄(即查出多少行,不包括字段名那行)。
第5個參數是多少個字段(多少列)。
第6個參數是錯誤信息。
pazResult返回的字符串數量實際上是(*pnRow+1)*(*pnColumn),因為前(*pnColumn)個是字段名
編程示例
#include <stdio.h>
#include <sqlite3.h>
#include <string.h>
int callback(void*,int,char**,char**);
int main()
{
sqlite3* db;
char* errmsg;
char *strSql = (char*)malloc(sizeof(char)*2048*1024);
char *showResult;
char** pResult;
int nRow;
int nCol ,i ,j,index=1;
int nResult = sqlite3_open("MyTest.db",&db);
if(nResult)
printf("can not open database.\n");
else
printf("open database succsee.\n");
nResult = sqlite3_exec(db,"create table fuck_U(id integer,name varchar(100))",NULL,NULL,&errmsg);
if (nResult != SQLITE_OK)
{
printf("errmsg = %s\n",errmsg);
/* sqlite3_close(db);
sqlite3_free(errmsg);*/
}
int kk = 0;
kk = sprintf(strSql,"insert into fuck_U values(%d,'zhangsan');\n",index);
for(index = 2;index < 100;index++)
{
kk += sprintf(strSql+kk,"insert into fuck_U values(%d,'zhangsan');\n",index);
}
printf("%s",strSql);
nResult = sqlite3_exec(db,strSql,NULL,NULL,&errmsg);
if (nResult != SQLITE_OK)
{
//sqlite3_close(db);
printf("errmsg= %s\n",errmsg);
//sqlite3_free(errmsg);
//return 0;
}
strSql = "select * from fuck_U";
nResult = sqlite3_get_table(db,strSql,&pResult,&nRow,&nCol,&errmsg);
if (nResult != SQLITE_OK)
{
sqlite3_close(db);
printf("errmsg= %s\n",errmsg);
sqlite3_free(errmsg);
return 0;
}
printf("nRow= %d\n",nRow);
printf("nCol= %d\n",nCol);
char strOut[1024];
int nIndex = nCol;
int pos = 0;
printf("hello sqlite db\n");
for(i=0;i<nRow;i++)
{
for(j=0;j<nCol;j++)
{
pos = sprintf(strOut,"%s:",pResult[j]);
pos += sprintf(strOut+pos,"%s",pResult[nIndex]);
printf("%s\n",strOut);
++nIndex;
}
}
sqlite3_free_table(pResult);
sqlite3_close(db);
return 0;
}
運行結果部分下圖所示
智能推薦
SQLite3源碼學習(9)Page Cache概述
Page cache是進程分配的內存空間,用來緩存數據頁面。page cache的管理獨立于操作系統,當一個線程打開一個數據庫連接時就會建立一個page cache,對于一個進程中的多線程,它們可以有獨立的cache也可以共享一個cahce,下圖描述了page cache的結構: 在Pager初始化時為pPager->pPCa...
Sqlite3源碼學習(5)OS的接口VFS
之前講了那么多的環境搭建,現在終于可以學習源碼了。官方有一篇講解VFS的文檔,對理解sqlite3的VFS有很大的幫助: http://www.sqlite.org/vfs.html 1.VFS簡介 VFS也就是所謂的虛擬文件系統,因為sqlite3運行在不同的平臺上會有不同的文件系統,V...
使用sqlite3的一定總結
從來沒有接觸過數據庫,因為最近的一個項目接觸了sqlite3,記錄一些經驗總結; 自學參考資料 sqlite3的相關文件,直接放在主程序的目錄內;(這樣不用額外設置路徑,項目小可以這樣做) 設置一下附加依賴項: 方式一:項目屬性—-鏈接器—-輸入—-添加”sqlite3.lib”(根據具體情況,有時需要添加附加庫目錄) 方式二:#prag...
sqlite3中的一些PRAGMA語句
1.問題原由 需要修改sqlite的一些配置和數據庫操作,eg. 查詢THREADSAFE等編譯選項。但是用的qt封裝的QSqlDatabase類。無法執行sqlite源碼中的一些原生函數。后面發現可以通過執行PRAGMA的一些語句來達到目的。 2.參考資料和使用方法 最一手的資料當然是官方的資料 https://www.sqlite.org/pragma.html &nb...
調用sqlite3示例
這是以靜態鏈接lib方式實現的調用,dll方式待更新 1.從官網下載源碼 https://sqlite.org/download.html 我下載的是: 2.下載后創建.lib靜態庫項目,把解壓后的文件中的3個扔到新建的項目 然后可以直接編譯,但是會報錯。 3.修改項目屬性,改為:不使用編譯頭 然后再重新編譯 4.新建項目sqlite_demo,把s...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...