什麼是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語法和資料庫檔案格式的向後相容性。