首頁>技術>

什麼是SQLite?

SQLite是一個程序庫,實現了一個自包含的,無伺服器,零配置及事務性的SQL資料庫引擎。

SQLite的原始碼是公開的,因此可以免費用於任何目的,無論是否是商業目的。

SQLite是世界上部署最廣泛的資料庫,其應用程式數量超出我們的想象,其中包括Adobe公司、Airbus公司、FaceBook、微軟、蘋果和谷歌等世界知名企業,SQLite資料庫檔案也是美國國會圖書館推薦的儲存格式。

SQLite是嵌入式SQL資料庫引擎,與大多數其他SQL資料庫不同,SQLite沒有單獨的伺服器程序。

SQLite直接讀取和寫入普通磁碟檔案,具有多個表、索引、觸發器和檢視的完整SQL資料庫包含在單個磁碟檔案中。

資料庫檔案格式是跨平臺的,因此可以在32位和64位系統之間或在big-endian和 little-endian 體系結構之間自由複製資料庫,這些功能使SQLite成為應用程式檔案格式的流行選擇。

SQLite是一個緊湊的庫,啟用所有功能後,庫大小可以小於600KB,具體取決於目標平臺和編譯器最佳化的設定。

SQLite在記憶體越大的情況下執行速度就越快,即使在低記憶體環境下,效能通常也相當不錯,甚至可能會比直接透過系統I/O讀取更快。

SQLite官網

另外,還需要下載模組定義檔案sqlite3.def,否則無法生成sqlite3.lib庫,如下圖所示。

下載預編譯檔案

為了便於使用,可以把原始碼和預編譯檔案的32位與64位版本都下載下來,如下圖所示。

原始碼檔案壓縮包

將檔案進行解壓,根據實際需要,預編譯檔案可以選擇32位或64位版本,最後將原始碼檔案彙總到一個目錄中備用,如下圖所示。

原始碼檔案

以上準備工作就緒之後,接下來就可以對原始碼進行編輯了。

在VS2015中新建一個名為“sqlite3”的Win32專案,如下圖所示。

新建Win32專案

應用程式設定

專案新建完成後,將之前準備的原始碼檔案複製到工程目錄,如下圖所示。

原始碼準備

透過新增現有項功能,將標頭檔案sqlite.h和sqlite3ext.h新增到工程中,如下圖所示。

匯入原始碼標頭檔案

另外,也需要將shell.c、sqlite3.c和sqlite3.def新增到原始檔中,如下圖所示。

匯入原始碼完成

現在如果直接編譯工程,則不會生成sqlite3.lib庫檔案,因此需要在專案屬性中設定sqlite3.def模組定義檔案,如下圖所示。

配置模組定義檔案

現在將原始碼進行編輯之後,會生成許多錯誤提示:

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_column_database_name

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_column_database_name16

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_column_origin_name

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_column_origin_name16

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_column_table_name

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_column_table_name16

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_deserialize

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_fts3_may_be_corrupt

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_fts5_may_be_corrupt

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_preupdate_count

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_preupdate_depth

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_preupdate_hook

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_preupdate_new

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_preupdate_old

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_rtree_geometry_callback

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_rtree_query_callback

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_serialize

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changegroup_add

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changegroup_add_strm

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changegroup_delete

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changegroup_new

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changegroup_output

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changegroup_output_strm

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_apply

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_apply_strm

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_apply_v2

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_apply_v2_strm

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_concat

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_concat_strm

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_conflict

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_finalize

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_fk_conflicts

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_invert

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_invert_strm

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_new

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_next

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_old

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_op

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_pk

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_start

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_start_strm

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_start_v2

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_start_v2_strm

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3rebaser_configure

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3rebaser_create

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3rebaser_delete

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3rebaser_rebase

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3rebaser_rebase_strm

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_attach

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_changeset

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_changeset_strm

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_config

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_create

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_delete

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_diff

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_enable

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_indirect

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_isempty

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_memory_used

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_patchset

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_patchset_strm

1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_table_filter

生成錯誤的原因,是因為在sqlite3.def中定義的函式在原始碼中預設沒有匯出,需要在工程屬性中新增以下預處理定義,如下所示。

SQLITE_CORE

SQLITE_EXPORTS

SQLITE_ENABLE_FTS3

SQLITE_ENABLE_FTS5

SQLITE_ENABLE_RTREE

SQLITE_ENABLE_COLUMN_METADATA

SQLITE_ENABLE_SESSION

SQLITE_ENABLE_PREUPDATE_HOOK

SQLITE_ENABLE_DESERIALIZE

新增宏定義

只要上述配置正確,無論是在Debug還是Release版本下都可以編譯成功,如下圖所示。

編譯成功

編譯成功後,就可以在原始碼工程的Debug或Release目錄中找到sqlite3.dll和sqlite3.lib檔案,如下圖所示。

編譯結果

現在,我們將下載的原始碼檔案壓縮包,編譯成功的工程原始碼整理到了一個目錄中,如下圖所示。

分享資料整理

總結

SQLite程式碼庫由一支全職從事SQLite工作的國際開發人員團隊支援,以持續擴充套件SQLite的功能並增強其可靠性和效能,同時保持與已釋出的介面規範,以及SQL語法和資料庫檔案格式的向後相容性。

8
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 乾貨!使用Java註解和反射實現Junit4中的用例呼叫(附原始碼)