在我最近一直在做的有關 Kindle 批註管理軟件的項目中,對於數據庫我是用的是 SQLITE,在這篇文章中我會介紹一下 SQLITE 數據庫,以及如何在 QT5 中使用它。
SQLITE 簡介
WHAT IS SQLITE?
SQLite,是一款輕型的數據庫,是遵守ACID的關係型數據庫管理系統,它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領域項目。它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統,同時能夠跟很多程序語言相結合,比如 Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源的世界著名數據庫管理系統來講,它的處理速度比他們都快。
不像常見的客戶-服務器範例,SQLite引擎不是個程序與之通信的獨立進程,而是連接到程序中成爲它的一個主要部分。所以主要的通信協議是在編程語言內的直接API調用。這在消耗總量、延遲時間和整體簡單性上有積極的作用。整個數據庫(定義、表、索引和數據本身)都在宿主主機上存儲在一個單一的文件中。它的簡單的設計是通過在開始一個事務的時候鎖定整個數據文件而完成的。
(來自百度百科)
WHY SQLITE?
從 SQLITE 的用途來看,它是一款輕量級的數據庫,並且一開始是設計給嵌入式設備的,我們知道 QT 其實現在也是在嵌入式方向應用的比較廣泛,因此 QT 內置有 SQLITE 數據庫的模塊,因此我們能夠比較容易上手。並且對於該項目使用文件形式的數據庫更加靈活和輕便,更加符合這個項目的需求。
在 QT 中使用 SQLITE
0x00 修改 .pro 文件
爲了能使用 SQLITE 我們必須在 QT 工程中的 .pro
文件中加入:
QT += core gui sql
0x01 查看 QT 支持哪些數據庫
我們可以通過 QSqlDatabase::drivers()
方法來獲取當前的 sql 模快中支持哪些數據庫,以我的 QT5 爲例:
qDebug() << QSqlDatabase::drivers();
執行結果爲:
("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
我們可以看到當前的 QT 是包含有 SQLITE 驅動的。
0x02 創建一個數據庫連接
我們來編寫一個 connect()
函數:
bool connect(const QString &dbName)
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(dbName);
if (!db.open()) {
qDebug() << "Database Error!";
return false;
}
return true;
}
使用這個函數我們可以創建一個名稱爲 dbName
的 SQLITE 數據庫。我們在 main
函數中測試一下:
if(connect("test.db")){
qDebug() << "Database Create Sucessfully!";
}
else{
qDebug() << "Database Create Failed!";
}
我們會看到在工程編譯後的目錄中生成了一個 test.db
文件,並且控制檯輸出了:
Database Create Sucessfully!
0x03 使用 SQL 語句
在 QT 中我們通過一個QSqlQuery實例執行 SQL 語句:
QSqlQuery query;
創建表
我們創建一個名叫 student
的表,包含三列id
, name
, age
:
if (!query.exec("CREATE TABLE student ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"name VARCHAR,"
"age INT)")) {
qDebug() << "Create Table Failed!";
}
插入條目
我們可以直接使用 query.exec()
來執行 INSERT
語句:
if(!query.exec("INSERT INTO student (name, age) VALUES (\"TOM\", 10)")){
qDebug() << "INSERT Failed!";
}
也可以使用下面的形式來一次添加多個條目:
query.prepare("INSERT INTO student (name, age) VALUES (?, ?)");
QVariantList names;
names << "Tom" << "Jack" << "Jane" << "Jerry";
query.addBindValue(names);
QVariantList ages;
ages << 20 << 23 << 22 << 25;
query.addBindValue(ages);
if (!query.execBatch()) {
qDebug() << "INSERT Failed!";
}
query.finish();
其它的語句都可以採用上面類似的方法進行實現,這裏不再贅述。
這次我們使用 SQL 語句完成了對數據庫的常規操作,包括簡單的 CREATE、INSERT 等語句的使用。其實,Qt 不僅提供了這種使用 SQL 語句的方式,還提供了一種基於模型的更高級的處理方式。這種基於QSqlTableModel 的模型處理更爲高級,如果對 SQL 語句不熟悉,並且不需要很多複雜的查詢,這種QSqlTableModel模型基本可以滿足一般的需求,以後我會介紹QSqlTableModel的一般使用。
本文的版權歸作者 羅遠航 所有,採用 Attribution-NonCommercial 3.0 License。任何人可以進行轉載、分享,但不可在未經允許的情況下用於商業用途;轉載請註明出處。感謝配合!