小巧。快速。可靠。
任選三項。
SQLite C/C++ 介面的簡介

1. 總結

以下兩個物件和八個方法組成了 SQLite 介面的基本元素

2. 簡介

SQLite 有超過 225 個 API。然而,大部分的 API 是選用的,且非常專門,初學者可以忽略。核心 API 很小、簡單且容易學習。本文摘要了核心 API。

另一份文件 SQLite C/C++ 介面 提供了所有 SQLite C/C++ API 的詳細規格。讀者一旦了解 SQLite 的基本運作原理,該文件 就應當做參考指南使用。本文僅作為簡介,並非 SQLite API 的完整或權威參考。

3. 核心物件和介面

SQL 資料庫引擎的主要任務是評估 SQL 陳述式。為達成此目的,開發人員需要兩個物件

嚴格來說,準備好的陳述物件並非必要,因為便利的包裝器介面,sqlite3_execsqlite3_get_table,可以使用,這些便利的包裝器封裝並隱藏準備好的陳述物件。儘管如此,了解準備好的陳述對於充分利用 SQLite 是必要的。

資料庫連線準備好的陳述物件由下列所列的一小組 C/C++ 介面例程控制。

請注意,上述例程清單是概念性的,而非實際的。其中許多例程有多個版本。例如,上述清單顯示一個名為sqlite3_open()的單一例程,但實際上有三個獨立的例程以略微不同的方式完成相同的事情:sqlite3_open()sqlite3_open16()sqlite3_open_v2()。清單提到sqlite3_column(),但實際上並不存在這樣的例程。清單中顯示的「sqlite3_column()」是一個佔位符,代表一個以各種資料類型擷取欄位資料的例程系列。

以下是核心介面的功能摘要

4. 核心常式與物件的典型用法

應用程式通常會在初始化期間使用 sqlite3_open() 來建立單一 資料庫連線。請注意,sqlite3_open() 可用於開啟現有的資料庫檔案或建立並開啟新的資料庫檔案。雖然許多應用程式只使用單一 資料庫連線,但沒有理由讓應用程式無法多次呼叫 sqlite3_open() 來開啟多個 資料庫連線,不論是連線到同一個資料庫或不同的資料庫。有時,多執行緒應用程式會為每個執行緒建立個別 資料庫連線。請注意,單一 資料庫連線 可以使用 ATTACH SQL 指令存取兩個或更多個資料庫,因此不需要為每個資料庫檔案建立個別資料庫連線。

許多應用程式會在關閉時使用呼叫 sqlite3_close() 來銷毀其資料庫連線。或者,例如,一個使用 SQLite 作為其應用程式檔案格式的應用程式可能會在回應檔案/開啟功能表動作時開啟資料庫連線,然後在回應檔案/關閉功能表時銷毀對應的資料庫連線

若要執行 SQL 陳述式,應用程式會執行下列步驟

  1. 使用 sqlite3_prepare() 建立準備好的陳述式
  2. 透過呼叫 sqlite3_step() 一次或多次來評估準備好的陳述式
  3. 對於查詢,在呼叫 sqlite3_step() 兩次之間呼叫 sqlite3_column() 來萃取結果。
  4. 使用 sqlite3_finalize() 來銷毀準備好的陳述式

上述就是有效使用 SQLite 所真正需要知道的一切。其他所有內容都是最佳化和細節。

5. 核心例程周圍的便利包裝器

sqlite3_exec() 介面是一個便利包裝器,它使用單一函式呼叫來執行上述所有四個步驟。傳遞到 sqlite3_exec() 的回呼函式用於處理結果集的每一列。 sqlite3_get_table() 是另一個便利包裝器,它執行上述所有四個步驟。 sqlite3_get_table() 介面與 sqlite3_exec() 不同之處在於,它將查詢結果儲存在堆疊記憶體中,而不是呼叫回呼。

了解到 sqlite3_exec()sqlite3_get_table() 都無法完成使用核心例程無法完成的工作非常重要。事實上,這些包裝器純粹以核心例程的形式實作。

6. 繫結參數和重複使用已準備好的陳述式

在先前的討論中,假設每個 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() 多次,以建立它們將會用到的所有 準備陳述。其他應用程式會保留最近使用的 準備陳述 快取,然後在可用時重新使用快取中的 準備陳述。另一種方法是在迴圈內時才重新使用 準備陳述

7. 設定 SQLite

SQLite 的預設設定對大多數應用程式來說都很好用。但有時開發人員會想要調整設定,以嘗試榨出更多效能,或利用一些不為人知的特色。

使用 sqlite3_config() 介面可對 SQLite 進行全域、處理程序範圍的設定變更。在建立任何 資料庫連線 之前,必須呼叫 sqlite3_config() 介面。程式設計師可以使用 sqlite3_config() 介面執行以下動作

在處理程序範圍的設定完成,且已建立 資料庫連線 之後,可以使用呼叫 sqlite3_limit()sqlite3_db_config() 來設定個別的資料庫連線。

8. 延伸 SQLite

SQLite 包含可延伸其功能的介面。這些常式包括

介面 sqlite3_create_collation() 用於建立新的 排序序列 以便對文字進行排序。介面 sqlite3_create_module() 用於註冊新的 虛擬表格 實作。介面 sqlite3_vfs_register() 用於建立新的 VFS

介面 sqlite3_create_function() 用於建立新的 SQL 函式,可以是純量或聚合函式。新的函式實作通常會使用下列附加介面

SQLite 的所有內建 SQL 函式都是使用完全相同的這些介面建立的。請參閱 SQLite 原始碼,特別是 date.cfunc.c 原始檔以取得範例。

共用函式庫或 DLL 可用作 SQLite 的 可載入延伸模組

9. 其他介面

本文僅提及最重要的和最常使用的 SQLite 介面。SQLite 函式庫包含許多其他 API,實作未在此處說明的有用功能。在 C/C++ 介面規格 中可以找到形成 SQLite 應用程式程式設計介面的 完整函式清單。請參閱該文件以取得有關所有 SQLite 介面的完整且權威資訊。

此頁面最後修改於 2023-10-10 17:29:48 UTC