一、概述:
在sqlite提供的c/c++介面中,其中5個apis屬於核心介面。在這篇部落格中我們將主要介紹它們的用法,以及它們所涉及到的核心sqlite物件,如database_connection和prepared_statement。相比於其它資料庫引擎提供的apis,如oci、mysql api等,sqlite提供的介面還是非常易於理解和掌握的。
二、核心物件和介面:
1. 核心物件:
在sqlite中最主要的兩個物件是,database_connection和prepared_statement。database_connection物件是由sqlite3_open()介面函式建立並返回的,在應用程式使用任何其他sqlite介面函式之前,必須先呼叫該函式以便獲得database_connnection物件,在隨後的其他apis呼叫中,都需要該物件作為輸入引數以完成相應的工作。至於prepare_statement,我們可以簡單的將它視為編譯後的sql語句,因此,所有和sql語句執行相關的函式也都需要該物件作為輸入引數以完成指定的sql操作。
2. 核心介面:
1). sqlite3_open
上面已經提到過這個函式了,它是操作sqlite資料庫的入口函式。該函式返回的database_connection物件是很多其他sqlite apis的控制代碼引數。注意,我們通過該函式既可以開啟已經存在的資料庫檔案,也可以建立新的資料庫檔案。對於該函式返回的database_connection物件,我們可以在多個執行緒之間共享該物件的指標,以便完成和資料庫相關的任意操作。然而在多執行緒情況下,我們更為推薦的使用方式是,為每個執行緒建立獨立的database_connection物件。對於該函式還有一點也需要額外說明,我們沒有必要為了訪問多個資料庫而建立多個資料庫連線物件,因為通過sqlite自帶的attach命令可以在乙個連線中方便的訪問多個資料庫。
2). sqlite3_prepare
該函式將sql文字轉換為prepared_statement物件,並在函式執行後返回該物件的指標。事實上,該函式並不會評估引數指定sql語句,它僅僅是將sql文字初始化為待執行的狀態。最後需要指出的,對於新的應用程式我們可以使用sqlite3_prepare_v2介面函式來替代該函式以完成相同的工作。
3). sqlite3_step
該函式用於評估sqlite3_prepare函式返回的prepared_statement物件,在執行完該函式之後,prepared_statement物件的內部指標將指向其返回的結果集的第一行。如果打算進一步迭代其後的資料行,就需要不斷的呼叫該函式,直到所有的資料行都遍歷完畢。然而對於insert、update和delete等dml語句,該函式執行一次即可完成。
4). sqlite3_column
該函式用於獲取當前行指定列的資料,然而嚴格意義上講,此函式在sqlite的介面函式中並不存在,而是由一組相關的介面函式來完成該功能,其中每個函式都返回不同型別的資料,如:
sqlite3_column_blob
sqlite3_column_bytes
sqlite3_column_bytes16
sqlite3_column_double
sqlite3_column_int
sqlite3_column_int64
sqlite3_column_text
sqlite3_column_text16
sqlite3_column_type
sqlite3_column_value
sqlite3_column_count
其中sqlite3_column_count函式用於獲取當前結果集中的字段資料。下面是使用sqlite3_step和sqlite3_column函式迭代結果集中每行資料的偽**,注意這裡作為示例**簡化了對字段型別的判斷:
1 int fieldcount = sqlite3_column_count(...);
2 while (sqlite3_step(...) <> eof)
6 }
5). sqlite3_finalize
該函式用於銷毀prepared statement物件,否則將會造成記憶體洩露。
6). sqlite3_close
該函式用於關閉之前開啟的database_connection物件,其中所有和該物件相關的prepared_statements物件都必須在此之前先被銷毀。
三、引數繫結:
和大多數關係型資料庫一樣,sqlite的sql文字也支援變數繫結,以便減少sql語句被動態解析的次數,從而提高資料查詢和資料操作的效率。要完成該操作,我們需要使用sqlite提供的另外兩個介面apis,sqlite3_reset和sqlite3_bind。見如下示例:
1 void test_parameter_binding()
10 //2. 引數繫結的情況下插入多條資料。
11 string strsqlwithparameter = "insert into testtable values(?)";
12 sqlite3_prepare_v2(..., strsql);
13 for (int i = 0; i < max_rows; ++i)
18 sqlite3_finalize(prepared_stmt);
19 }
這裡首先需要說明的是,sql語句"insert into testtable values(?)"中的問號(?)表示引數變數的佔位符,該規則在很多關係型資料庫中都是一致的,因此這對於資料庫移植操作還是比較方便的。
通過上面的示例**可以顯而易見的看出,引數繫結寫法的執行效率要高於每次生成不同的sql語句的寫法,即2)在效率上要明顯優於1),下面是針對這兩種寫法的具體比較:
1). 單單從程式表面來看,前者在for迴圈中執行了更多的任務,比如字串的填充、sql語句的prepare,以及prepared_statement物件的釋放。
2). 在sqlite的官方文件中明確的指出,sqlite3_prepare_v2的執行效率往往要低於sqlite3_step的效率。
3). 當插入的資料量較大時,後者帶來的效率提公升還是相當可觀的。
作者 stephen liu
SQLite學習手冊
在實際的應用中,sqlite作為目前最為流行的開源嵌入式關係型資料庫,在系統的架構設計中正在扮演著越來越為重要的角色。和很多其它嵌入式nosql資料庫不同的是,sqlite支援很多關係型資料庫的基本特徵,這在資料移植 程式演示等應用中有著不可替代的優勢。從官方文件中我們可以獲悉到,sqlite支援的...
SQLite學習手冊 目錄
在實際的應用中,sqlite作為目前最為流行的開源嵌入式關係型資料庫,在系統的架構設計中正在扮演著越來越為重要的角色。和很多其它嵌入式nosql資料庫不同的是,sqlite支援很多關係型資料庫的基本特徵,這在資料移植 程式演示等應用中有著不可替代的優勢。從官方文件中我們可以獲悉到,sqlite支援的...
SQLite學習手冊 開篇
一 簡介 sqlite是目前最流行的開源嵌入式資料庫,和很多其他嵌入式儲存引擎相比 nosql 如berkeleydb membase等,sqlite可以很好的支援關係型資料庫所具備的一些基本特徵,如標準sql語法 事務 資料表和索引等。事實上,儘管sqlite擁有諸多關係型資料庫的基本特徵,然而由...