以下兩個物件和八個方法組成了 SQLite 介面的基本元素
sqlite3 → 資料庫連線物件。由 sqlite3_open() 建立,並由 sqlite3_close() 銷毀。
sqlite3_stmt → 已準備的陳述式物件。由 sqlite3_prepare() 建立,並由 sqlite3_finalize() 銷毀。
sqlite3_open() → 開啟與新的或現有的 SQLite 資料庫的連線。 sqlite3 的建構函式。
sqlite3_prepare() → 將 SQL 文字編譯成位元組碼,用於查詢或更新資料庫。 sqlite3_stmt 的建構函式。
sqlite3_bind() → 將應用程式資料儲存到原始 SQL 的 參數 中。
sqlite3_step() → 將 sqlite3_stmt 進階到下一個結果列或完成。
sqlite3_column() → sqlite3_stmt 的目前結果列中的欄位值。
sqlite3_finalize() → sqlite3_stmt 的解構函式。
sqlite3_close() → sqlite3 的解構函式。
sqlite3_exec() → 一個包裝函式,可針對一個或多個 SQL 陳述字串執行 sqlite3_prepare()、sqlite3_step()、sqlite3_column() 和 sqlite3_finalize()。
SQLite 有超過 225 個 API。然而,大部分的 API 是選用的,且非常專門,初學者可以忽略。核心 API 很小、簡單且容易學習。本文摘要了核心 API。
另一份文件 SQLite C/C++ 介面 提供了所有 SQLite C/C++ API 的詳細規格。讀者一旦了解 SQLite 的基本運作原理,該文件 就應當做參考指南使用。本文僅作為簡介,並非 SQLite API 的完整或權威參考。
SQL 資料庫引擎的主要任務是評估 SQL 陳述式。為達成此目的,開發人員需要兩個物件
嚴格來說,準備好的陳述物件並非必要,因為便利的包裝器介面,sqlite3_exec 或 sqlite3_get_table,可以使用,這些便利的包裝器封裝並隱藏準備好的陳述物件。儘管如此,了解準備好的陳述對於充分利用 SQLite 是必要的。
資料庫連線和準備好的陳述物件由下列所列的一小組 C/C++ 介面例程控制。
請注意,上述例程清單是概念性的,而非實際的。其中許多例程有多個版本。例如,上述清單顯示一個名為sqlite3_open()的單一例程,但實際上有三個獨立的例程以略微不同的方式完成相同的事情:sqlite3_open()、sqlite3_open16()和sqlite3_open_v2()。清單提到sqlite3_column(),但實際上並不存在這樣的例程。清單中顯示的「sqlite3_column()」是一個佔位符,代表一個以各種資料類型擷取欄位資料的例程系列。
以下是核心介面的功能摘要
此例程開啟與 SQLite 資料庫檔案的連線,並傳回資料庫連線物件。這通常是應用程式執行的第一個 SQLite API 呼叫,也是大多數其他 SQLite API 的先決條件。許多 SQLite 介面需要指向資料庫連線物件的第一個參數,並且可以視為資料庫連線物件的方法。此例程是資料庫連線物件的建構函式。
此例程將 SQL 文字轉換為準備好的陳述物件,並傳回指向該物件的指標。此介面需要由先前呼叫sqlite3_open()建立的資料庫連線指標,以及包含要準備的 SQL 陳述的文字字串。此 API 實際上並未評估 SQL 陳述。它僅準備 SQL 陳述以進行評估。
將每一個 SQL 陳述式想成一個小型電腦程式。 sqlite3_prepare() 的目的是將該程式編譯成物件碼。 已準備好的陳述式 是物件碼。 sqlite3_step() 介面接著執行物件碼以取得結果。
新的應用程式應始終呼叫 sqlite3_prepare_v2(),而非 sqlite3_prepare()。較舊的 sqlite3_prepare() 保留以維持向後相容性。但 sqlite3_prepare_v2() 提供了更好的介面。
此常式用於評估先前由 sqlite3_prepare() 介面建立的 已準備好的陳述式。陳述式評估至第一列結果可用的點。若要進到第二列結果,請再次呼叫 sqlite3_step()。持續呼叫 sqlite3_step(),直到陳述式完成。不會傳回結果的陳述式(例如:INSERT、UPDATE 或 DELETE 陳述式)在單次呼叫 sqlite3_step() 時執行至完成。
此常式會傳回 sqlite3_step() 正在評估的 已準備好的陳述式 的結果集目前列的單一欄位。每次 sqlite3_step() 停止時,會出現新的結果集列,此常式可以被呼叫多次以找出該列中所有欄位的數值。
如上所述,SQLite API 中並不存在「sqlite3_column()」函數。相反地,我們在此稱呼的「sqlite3_column()」是一個佔位符,代表一整個函數系列,用於從各種資料類型中的結果集中傳回值。此系列中也有函數用於傳回結果的大小(如果是字串或 BLOB)以及結果集中的欄位數。
此常式會銷毀先前呼叫 sqlite3_prepare() 所建立的 已準備好的陳述式。每個已準備好的陳述式都必須使用呼叫此常式來銷毀,以避免記憶體外洩。
此常式會關閉先前呼叫 sqlite3_open() 所開啟的 資料庫連線。所有與連線相關聯的 已準備好的陳述式 都應在關閉連線之前 完成。
應用程式通常會在初始化期間使用 sqlite3_open() 來建立單一 資料庫連線。請注意,sqlite3_open() 可用於開啟現有的資料庫檔案或建立並開啟新的資料庫檔案。雖然許多應用程式只使用單一 資料庫連線,但沒有理由讓應用程式無法多次呼叫 sqlite3_open() 來開啟多個 資料庫連線,不論是連線到同一個資料庫或不同的資料庫。有時,多執行緒應用程式會為每個執行緒建立個別 資料庫連線。請注意,單一 資料庫連線 可以使用 ATTACH SQL 指令存取兩個或更多個資料庫,因此不需要為每個資料庫檔案建立個別資料庫連線。
許多應用程式會在關閉時使用呼叫 sqlite3_close() 來銷毀其資料庫連線。或者,例如,一個使用 SQLite 作為其應用程式檔案格式的應用程式可能會在回應檔案/開啟功能表動作時開啟資料庫連線,然後在回應檔案/關閉功能表時銷毀對應的資料庫連線。
若要執行 SQL 陳述式,應用程式會執行下列步驟
上述就是有效使用 SQLite 所真正需要知道的一切。其他所有內容都是最佳化和細節。
sqlite3_exec() 介面是一個便利包裝器,它使用單一函式呼叫來執行上述所有四個步驟。傳遞到 sqlite3_exec() 的回呼函式用於處理結果集的每一列。 sqlite3_get_table() 是另一個便利包裝器,它執行上述所有四個步驟。 sqlite3_get_table() 介面與 sqlite3_exec() 不同之處在於,它將查詢結果儲存在堆疊記憶體中,而不是呼叫回呼。
了解到 sqlite3_exec() 和 sqlite3_get_table() 都無法完成使用核心例程無法完成的工作非常重要。事實上,這些包裝器純粹以核心例程的形式實作。
在先前的討論中,假設每個 SQL 陳述式準備一次,評估一次,然後銷毀。但是,SQLite 允許對同一個 已準備好的陳述式 進行多次評估。這可使用下列例程完成
在 已準備好的陳述式 已透過一次或多次呼叫 sqlite3_step() 進行評估後,可透過呼叫 sqlite3_reset() 重設它,以便透過呼叫 sqlite3_reset() 再次進行評估。將 sqlite3_reset() 視為將 已準備好的陳述式 程式碼倒回至開頭。對現有的 已準備好的陳述式 使用 sqlite3_reset() 而不是建立新的 已準備好的陳述式 可避免不必要的 sqlite3_prepare() 呼叫。對於許多 SQL 陳述式,執行 sqlite3_prepare() 所需的時間等於或超過 sqlite3_step() 所需的時間。因此,避免呼叫 sqlite3_prepare() 可大幅提升效能。
通常不會有評估完全相同的 SQL 陳述式超過一次的用途。更常會想要評估類似的陳述式。例如,您可能想要評估 INSERT 陳述式多次,並使用不同的值。或者,您可能想要使用 WHERE 子句中的不同金鑰來評估相同的查詢多次。為了適應這種情況,SQLite 允許 SQL 陳述式包含在評估之前「繫結」至值的參數。這些值稍後可以變更,且相同的已準備好的陳述式可以使用新的值評估第二次。
SQLite 允許參數出現在查詢或資料修改陳述式中允許字串文字、blob 文字、數字常數或 NULL 的任何地方。(DQL 或 DML)(參數不得用於欄位或資料表名稱,或作為約束或預設值的數值。(DDL))參數採用下列其中一種形式
在上述範例中,NNN 是整數值,而 AAA 是識別碼。參數最初的值為 NULL。在第一次呼叫 sqlite3_step() 之前或在 sqlite3_reset() 之後,應用程式可以呼叫 sqlite3_bind() 介面,將值附加至參數。每次呼叫 sqlite3_bind() 都會覆寫同一參數上的先前繫結。
應用程式允許多重準備 SQL 陳述,並在需要時評估它們。沒有任何限制未完成的 準備陳述 數量。有些應用程式在啟動時呼叫 sqlite3_prepare() 多次,以建立它們將會用到的所有 準備陳述。其他應用程式會保留最近使用的 準備陳述 快取,然後在可用時重新使用快取中的 準備陳述。另一種方法是在迴圈內時才重新使用 準備陳述。
SQLite 的預設設定對大多數應用程式來說都很好用。但有時開發人員會想要調整設定,以嘗試榨出更多效能,或利用一些不為人知的特色。
使用 sqlite3_config() 介面可對 SQLite 進行全域、處理程序範圍的設定變更。在建立任何 資料庫連線 之前,必須呼叫 sqlite3_config() 介面。程式設計師可以使用 sqlite3_config() 介面執行以下動作
在處理程序範圍的設定完成,且已建立 資料庫連線 之後,可以使用呼叫 sqlite3_limit() 和 sqlite3_db_config() 來設定個別的資料庫連線。
SQLite 包含可延伸其功能的介面。這些常式包括
介面 sqlite3_create_collation() 用於建立新的 排序序列 以便對文字進行排序。介面 sqlite3_create_module() 用於註冊新的 虛擬表格 實作。介面 sqlite3_vfs_register() 用於建立新的 VFS。
介面 sqlite3_create_function() 用於建立新的 SQL 函式,可以是純量或聚合函式。新的函式實作通常會使用下列附加介面
SQLite 的所有內建 SQL 函式都是使用完全相同的這些介面建立的。請參閱 SQLite 原始碼,特別是 date.c 和 func.c 原始檔以取得範例。
共用函式庫或 DLL 可用作 SQLite 的 可載入延伸模組。
本文僅提及最重要的和最常使用的 SQLite 介面。SQLite 函式庫包含許多其他 API,實作未在此處說明的有用功能。在 C/C++ 介面規格 中可以找到形成 SQLite 應用程式程式設計介面的 完整函式清單。請參閱該文件以取得有關所有 SQLite 介面的完整且權威資訊。
此頁面最後修改於 2023-10-10 17:29:48 UTC