SQLite:輕量級(jí)嵌入式數(shù)據(jù)庫(kù)
原創(chuàng) | 文 BFT機(jī)器人

引言
SQLite是一個(gè)進(jìn)程內(nèi)的庫(kù),實(shí)現(xiàn)了自給自足的、無服務(wù)器的、零配置的、事務(wù)性的 SQL 數(shù)據(jù)庫(kù)引擎。它是一個(gè)零配置的數(shù)據(jù)庫(kù),這意味著與其他數(shù)據(jù)庫(kù)不一樣,您不需要在系統(tǒng)中配置。就像其他數(shù)據(jù)庫(kù),SQLite 引擎不是一個(gè)獨(dú)立的進(jìn)程,可以按應(yīng)用程序需求進(jìn)行靜態(tài)或動(dòng)態(tài)連接。同樣SQLite可以直接訪問其存儲(chǔ)文件。
SQLite占用資源少,非常適合在嵌入式設(shè)備里面,同時(shí)有很多種語言的接口,其中用SQLite最多的語言是C++。而C++在工業(yè)領(lǐng)域應(yīng)用廣泛,所以工業(yè)上的軟件設(shè)計(jì)基本上都是用SQLite這個(gè)數(shù)據(jù)庫(kù)。
在嵌入式系統(tǒng)、移動(dòng)應(yīng)用程序、桌面應(yīng)用程序和小型Web應(yīng)用程序中。它可以作為單用戶應(yīng)用程序的本地?cái)?shù)據(jù)庫(kù)存儲(chǔ)解決方案,或者作為客戶端-服務(wù)器架構(gòu)中的輕量級(jí)數(shù)據(jù)庫(kù)。
當(dāng)然數(shù)據(jù)庫(kù)作為一個(gè)數(shù)據(jù)的管理者,我們每次都運(yùn)行軟件來顯示數(shù)據(jù)庫(kù)的話會(huì)比較麻煩,所以我們通常用數(shù)據(jù)庫(kù)可視化工具來查看數(shù)據(jù)庫(kù),同時(shí)也是數(shù)據(jù)庫(kù)管理工具,這邊介紹一下Navicat Premium。
Navicat Premium作為一款數(shù)據(jù)庫(kù)管理工具,是一個(gè)可多重連線資料庫(kù)的管理工具,它可以讓你以單一程式同時(shí)連線到 MySQL、SQLite、及Oracle,讓管理不同類型的資料庫(kù)更加的方便。下圖是Navicat Premium里面顯示數(shù)據(jù)庫(kù)時(shí)的界面。

基本操作
定義一個(gè)SQLite數(shù)據(jù)庫(kù):QSqlDatabase DB_;//數(shù)據(jù)庫(kù)
定義一個(gè)SQLite數(shù)據(jù)模型:
QSqlTableModel* tabel_model; //數(shù)據(jù)模型(一張數(shù)據(jù)表)
創(chuàng)建一個(gè)數(shù)據(jù)表:
tabel_model = new QSqlTableModel(this, DB_);
設(shè)置數(shù)據(jù)表的名稱:
tabel_model ->setTable("teacher");
設(shè)置數(shù)據(jù)表的保存方式:
tabel_model ->setEditStrategy(QSqlTableModel::OnManualSubmit);
設(shè)置數(shù)據(jù)表的排序方式:
tabel_model ->setSort(tab_model_->fieldIndex("Date"), Qt::AscendingOrder);
創(chuàng)建數(shù)據(jù)庫(kù)表
QSqlQuery sqlQuery;
QString sql = "";
sql = "create table teacher(teacher_id integer primary key, teacher_name text , teacher_gender text, teacher_age integer)";
if(!sqlQuery.exec(sql))
{
qDebug()<<"創(chuàng)建teacher表失敗?。?#34;;
}
else
{
qDebug()<<"創(chuàng)建teacher表成功";
}
創(chuàng)建的表如下圖所示:

2、Qt中設(shè)置字段顯示名
tabel_model->setHeaderData(tab_model_->fieldIndex("teacher_id "), Qt::Horizontal, QString::fromLocal8Bit("ID"));
tabel_model->setHeaderData(tab_model_->fieldIndex("teacher_name"), Qt::Horizontal, QString::fromLocal8Bit("名字"));
tabel_model->setHeaderData(tab_model_->fieldIndex("teacher_gender"), Qt::Horizontal, QString::fromLocal8Bit("性別"));
tabel_model->setHeaderData(tab_model_->fieldIndex("teacher_age"), Qt::Horizontal, QString::fromLocal8Bit("年齡"));
3、給teacher表添加數(shù)據(jù)
tabel_model ->insertRow(tabel_model ->rowCount(), QModelIndex());
//在末尾添加一個(gè)記錄
curIndex = tabel_model ->index(tabel_model ->rowCount() - 1, 1);
//創(chuàng)建最后一行的ModelIndex
int currow = curIndex_.row();
//當(dāng)前行
tabel_model ->setData(teacher ->index(currow, 1),id);
//給currow行的第一列插入id
對(duì)于其他列的插入,可以用循環(huán)解決。
SQL (Structured Query Language:結(jié)構(gòu)化查詢語言)
是用于管理關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)。SQL 的范圍包括數(shù)據(jù)插入、查詢、更新和刪除,數(shù)據(jù)庫(kù)模式創(chuàng)建和修改,以及數(shù)據(jù)訪問控制。
假定有一個(gè)表student,屬性有name,gender,age,hobby。
以下是SQL語句中增刪改查的介紹。
SELECT語法
SELECT column_name,column_name FROM table_name;
SELECT * FROM table_name;
查詢student 表中所有的數(shù)據(jù):select * from student;
SQL WHERE 語法
SELECT column_name,column_name FROM table_name WHERE column_name operator value;
查詢student表中所有女同學(xué):select * from student where gender=’女’;
INSERT語法
INSERT INTO table_name VALUES (value1,value2,value3,...);
給student表插入一組數(shù)據(jù):insert into student values(“小明”,’男’,18,”打籃球”);
UPDATE語法
UPDATE table_name SET column1=value1 WHERE some_column=some_value
將小明的愛好更新為打羽毛球:update student set hobby=“打羽毛球” where name=“小明”;
DELETE語法
DELETE FROM table_name WHERE some_column=some_value;
將小明這條記錄刪除:delete from student where name=”小明”;
特點(diǎn)優(yōu)勢(shì)
SQLite作為一種嵌入式關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由D. Richard Hipp于2000年設(shè)計(jì)和開發(fā)的,其設(shè)計(jì)目標(biāo)是提供一個(gè)輕量級(jí)的、自包含的數(shù)據(jù)庫(kù)引擎,可以在各種平臺(tái)上無縫運(yùn)行。主要有以下幾個(gè)特點(diǎn):
嵌入式數(shù)據(jù)庫(kù):SQLite以靜態(tài)庫(kù)的形式提供,可以直接嵌入到應(yīng)用程序中,而不需要獨(dú)立的數(shù)據(jù)庫(kù)服務(wù)器進(jìn)程。這使得SQLite在資源有限的環(huán)境中使用非常方便,而且沒有獨(dú)立的服務(wù)器管理開銷。
輕量級(jí):SQLite的核心引擎非常小巧,代碼庫(kù)輕量且高效。這使得SQLite成為適用于嵌入式系統(tǒng)和移動(dòng)設(shè)備的理想選擇。
零配置:使用SQLite數(shù)據(jù)庫(kù)不需要任何繁瑣的配置或管理任務(wù)。創(chuàng)建數(shù)據(jù)庫(kù)文件后,即可立即開始使用。
交易支持:SQLite支持完整的ACID事務(wù)屬性(原子性、一致性、隔離性和持久性),可以確保數(shù)據(jù)的完整性和一致性。
支持多種編程語言:SQLite可以通過C/C++、Java、Python、PHP等多種編程語言進(jìn)行訪問和操作。
跨平臺(tái):SQLite是跨平臺(tái)的,可以在各種操作系統(tǒng)(如Windows、Linux、macOS等)上運(yùn)行,并且與主流編程語言的綁定庫(kù)相容性良好。
高性能:盡管SQLite的設(shè)計(jì)目標(biāo)是輕量級(jí),但它具備相當(dāng)高的性能。SQLite的查詢執(zhí)行速度快,適用于許多中小型應(yīng)用程序。
支持豐富的SQL功能:SQLite支持標(biāo)準(zhǔn)的SQL查詢語句,包括復(fù)雜的查詢、子查詢、內(nèi)連接、外連接、聚合函數(shù)等。
應(yīng)用領(lǐng)域
SQLite在生活中的應(yīng)用隨處可見,如Mozilla Firefox瀏覽器使用SQLite作為其內(nèi)部的存儲(chǔ)引擎,用于管理書簽、歷史記錄、擴(kuò)展和其他瀏覽器數(shù)據(jù)。Adobe的一些軟件,如Lightroom和Photoshop Elements,使用SQLite來管理和存儲(chǔ)照片庫(kù)、目錄結(jié)構(gòu)、元數(shù)據(jù)和其他相關(guān)信息。
許多聊天應(yīng)用程序,包括WhatsApp、Telegram和Signal,使用SQLite來存儲(chǔ)聊天記錄、聯(lián)系人信息、設(shè)置等。操作系統(tǒng),如iOS和Android,使用SQLite來管理系統(tǒng)的各種配置、用戶數(shù)據(jù)、日志等。
物聯(lián)網(wǎng)設(shè)備通常需要一種輕量級(jí)的數(shù)據(jù)庫(kù)來存儲(chǔ)和查詢傳感器數(shù)據(jù)、設(shè)備狀態(tài)等。SQLite在這方面得到廣泛應(yīng)用,用于物聯(lián)網(wǎng)設(shè)備的數(shù)據(jù)存儲(chǔ)和處理。GPS導(dǎo)航應(yīng)用程序使用SQLite來存儲(chǔ)地圖數(shù)據(jù)、路線信息、興趣點(diǎn)等,以實(shí)現(xiàn)離線導(dǎo)航功能。
很多數(shù)據(jù)收集應(yīng)用和移動(dòng)應(yīng)用,如調(diào)查應(yīng)用、實(shí)時(shí)數(shù)據(jù)收集應(yīng)用等,使用SQLite來存儲(chǔ)和管理收集的數(shù)據(jù),以供離線使用或后續(xù)分析。總體而言其應(yīng)用范圍主要分為以下幾大類:
移動(dòng)應(yīng)用程序:許多移動(dòng)應(yīng)用程序使用SQLite作為本地存儲(chǔ)解決方案,用于存儲(chǔ)用戶數(shù)據(jù)、設(shè)置信息、離線數(shù)據(jù)等。例如,iOS和Android平臺(tái)的應(yīng)用程序可以使用SQLite來管理本地?cái)?shù)據(jù)存儲(chǔ)。
桌面應(yīng)用程序:SQLite可以用于桌面應(yīng)用程序中的本地?cái)?shù)據(jù)存儲(chǔ),例如日歷應(yīng)用、筆記應(yīng)用、個(gè)人管理工具等。許多常見的桌面應(yīng)用程序使用SQLite來管理和存儲(chǔ)數(shù)據(jù)。
嵌入式系統(tǒng):SQLite的輕量級(jí)和嵌入式特性使其在嵌入式系統(tǒng)中得到廣泛應(yīng)用。它可以用于智能家居設(shè)備、物聯(lián)網(wǎng)設(shè)備、嵌入式傳感器等,提供數(shù)據(jù)存儲(chǔ)和查詢功能。
小型Web應(yīng)用程序:對(duì)于小型的Web應(yīng)用程序,特別是個(gè)人博客、靜態(tài)網(wǎng)站等,SQLite可以作為輕量級(jí)的數(shù)據(jù)庫(kù)解決方案。它可以用于存儲(chǔ)文章、評(píng)論、用戶數(shù)據(jù)等。
測(cè)試和原型開發(fā):SQLite的簡(jiǎn)單性和易用性使其成為開發(fā)人員在測(cè)試和原型開發(fā)階段使用的理想數(shù)據(jù)庫(kù)。它可以快速搭建原型,并進(jìn)行數(shù)據(jù)存儲(chǔ)和查詢操作。
數(shù)據(jù)分析和報(bào)告:SQLite可以用于小規(guī)模的數(shù)據(jù)分析和報(bào)告任務(wù)。分析人員可以使用SQLite來存儲(chǔ)和查詢數(shù)據(jù),執(zhí)行簡(jiǎn)單的SQL查詢,進(jìn)行數(shù)據(jù)篩選、聚合和分析。
比較差異
SQLite與其他常見的數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)相比,在架構(gòu)上,SQLite是一種嵌入式數(shù)據(jù)庫(kù),將數(shù)據(jù)庫(kù)引擎直接嵌入到應(yīng)用程序中,而不需要獨(dú)立的服務(wù)器進(jìn)程。相比之下,傳統(tǒng)的DBMS如MySQL、PostgreSQL和Oracle需要獨(dú)立的服務(wù)器和客戶端連接。
存儲(chǔ)方式上,SQLite以文件形式存儲(chǔ)整個(gè)數(shù)據(jù)庫(kù),而其他DBMS使用更復(fù)雜的存儲(chǔ)結(jié)構(gòu),如表空間、數(shù)據(jù)文件和日志文件。這使得SQLite在管理和備份數(shù)據(jù)庫(kù)方面更加簡(jiǎn)單和直觀。用戶上,SQLite是單用戶數(shù)據(jù)庫(kù),只能由一個(gè)進(jìn)程或線程訪問。
其他DBMS通常支持多用戶并發(fā)訪問,具備更復(fù)雜的鎖定和并發(fā)控制機(jī)制。相比于其他成熟的DBMS,SQLite在功能上可能相對(duì)較小。它不支持某些高級(jí)功能,如復(fù)雜的存儲(chǔ)過程、觸發(fā)器、外鍵約束等。
SQLite更注重簡(jiǎn)潔性和輕量級(jí)特性,適用于小型和嵌入式應(yīng)用。又由于SQLite是一個(gè)本地?cái)?shù)據(jù)庫(kù)引擎,直接與應(yīng)用程序交互,無需網(wǎng)絡(luò)通信和客戶端-服務(wù)器開銷,因此在某些場(chǎng)景下具有較高的性能表現(xiàn)。
然而,在高并發(fā)和大規(guī)模數(shù)據(jù)處理方面,其他DBMS可能更具優(yōu)勢(shì)。依據(jù)SQLite的嵌入式特性,部署和維護(hù)也非常簡(jiǎn)單。只需將SQLite庫(kù)文件包含在應(yīng)用程序中即可,無需獨(dú)立的數(shù)據(jù)庫(kù)安裝和配置。
總體而言,SQLite適用于那些對(duì)數(shù)據(jù)庫(kù)需求相對(duì)較小,或需要在資源受限環(huán)境中使用的應(yīng)用程序。它提供了簡(jiǎn)單、快速、輕量級(jí)的數(shù)據(jù)庫(kù)解決方案,特別適用于嵌入式系統(tǒng)、移動(dòng)應(yīng)用和小型應(yīng)用程序。對(duì)于需要更高級(jí)功能和復(fù)雜性的大型應(yīng)用,傳統(tǒng)的DBMS可能更具優(yōu)勢(shì)。
結(jié)語
SQLite是一種流行的嵌入式數(shù)據(jù)庫(kù)管理系統(tǒng),以其輕量級(jí)設(shè)計(jì)和高效性能在各個(gè)應(yīng)用領(lǐng)域廣泛應(yīng)用。作為嵌入式數(shù)據(jù)庫(kù),SQLite的優(yōu)勢(shì)在于其簡(jiǎn)化的部署過程和資源節(jié)省,使其成為小型和嵌入式應(yīng)用的理想選擇。
通過零配置和跨平臺(tái)兼容性,SQLite提供了簡(jiǎn)化的管理和開發(fā)體驗(yàn),并且可以在不同的操作系統(tǒng)和編程語言上使用。其核心功能包括數(shù)據(jù)庫(kù)創(chuàng)建與連接、SQL查詢與數(shù)據(jù)操作、事務(wù)支持與ACID屬性、數(shù)據(jù)類型與索引,以及數(shù)據(jù)庫(kù)文件和寫時(shí)復(fù)制(WAL)機(jī)制。
與傳統(tǒng)數(shù)據(jù)庫(kù)管理系統(tǒng)相比,SQLite的特點(diǎn)和優(yōu)勢(shì)在于其嵌入式特性、輕量級(jí)設(shè)計(jì)、簡(jiǎn)化管理和跨平臺(tái)兼容性,同時(shí)提供高性能和可靠性。無論是移動(dòng)應(yīng)用程序、桌面應(yīng)用程序、嵌入式系統(tǒng)、小型Web應(yīng)用程序還是數(shù)據(jù)分析和報(bào)告,SQLite都是一個(gè)強(qiáng)大而靈活的數(shù)據(jù)庫(kù)解決方案。
更多精彩內(nèi)容請(qǐng)關(guān)注公眾號(hào):BFT機(jī)器人
本文為原創(chuàng)文章,版權(quán)歸BFT機(jī)器人所有,如需轉(zhuǎn)載請(qǐng)與我們聯(lián)系。若您對(duì)該文章內(nèi)容有任何疑問,請(qǐng)與我們聯(lián)系,將及時(shí)回應(yīng)。