天天看點

Qt使用模型操作資料庫

前一章我們使用 SQL 語句完成了對資料庫的正常操作,包括簡單的 CREATE、SELECT 等語句的使用。我們也提到過,Qt 不僅提供了這種使用 SQL 語句的方式,還提供了一種基于模型的更進階的處理方式。這種基于 QSqlTableModel 的模型處理更為進階,如果對 SQL 語句不熟悉,并且不需要很多複雜的查詢,這種 QSqlTableModel 模型基本可以滿足一般的需求。本章我們将介紹 QSqlTableModel 的一般使用,對比 SQL 語句完成對資料庫的增删改查等的操作。值得注意的是,QSqlTableModel 并不一定非得結合 QListView 或 QTableView 使用,我們完全可以用其作一般性處理。

首先我們來看看如何使用 QSqlTableModel 進行 SELECT 操作:

if (connect("demo.db")) {
    QSqlTableModel model;
    model.setTable("student");
    model.setFilter("age > 20 and age < 25");
    if (model.select()) {
        for (int i = 0; i < model.rowCount(); ++i) {
            QSqlRecord record = model.record(i);
            QString name = record.value("name").toString();
            int age = record.value("age").toInt();
            qDebug() << name << ": " << age;
        }
    }
} else {
    return 1;
}
           

我們依舊使用了前一章的 connect() 函數。接下來我們建立了 QSqlTableModel 執行個體,使用 setTable() 函數設定所需要操作的表格;setFilter() 函數則是添加過濾器,也就是 WHERE 語句所需要的部分。例如上面代碼中的操作實際相當于 SQL 語句

SELECT * FROM student WHERE age > 20 and age < 25
           

使用 QSqlTableModel::select() 函數進行操作,也就是執行了查詢操作。如果查詢成功,函數傳回 true,由此判斷是否發生了錯誤。如果沒有錯誤,我們使用 record() 函數取出一行記錄,該記錄是以 QSqlRecord 的形式給出的,而 QSqlRecord::value() 則取出一個列的實際資料值。注意,由于 QSqlTableModel 沒有提供 const_iterator 周遊器,是以不能使用 foreach 宏進行周遊。

另外需要注意,由于 QSqlTableModel 隻是一種進階操作,肯定沒有實際 SQL 語句友善。具體來說,我們使用 QSqlTableModel 隻能進行 SELECT * 的查詢,不能隻查詢其中某些列的資料。

下面一段代碼則顯示了如何使用 QSqlTableModel 進行插入操作:

QSqlTableModel model;
model.setTable("student");
int row = 0;
model.insertRows(row, 1);
model.setData(model.index(row, 1), "Cheng");
model.setData(model.index(row, 2), 24);
model.submitAll();
           

插入也很簡單:model.insertRows(row, 1); 說明我們想在索引 0 的位置插入 1 行新的資料。使用 setData() 函數則開始準備實際需要插入的資料。注意這裡我們向 row 的第一個位置寫入 Cheng(通過 model.index(row, 1),回憶一下,我們把 model 當作一個二維表,這個坐标相當于第 row 行第 1 列),其餘以此類推。最後,調用 submitAll() 函數送出所有修改。這裡執行的操作可以用如下 SQL 表示:

INSERT INTO student (name, age) VALUES ('Cheng', 24)
           

當我們取出了已經存在的資料後,對其進行修改,然後重新寫入資料庫,即完成了一次更新操作:

QSqlTableModel model;
model.setTable("student");
model.setFilter("age = 25");
if (model.select()) {
    if (model.rowCount() == 1) {
        QSqlRecord record = model.record(0);
        record.setValue("age", 26);
        model.setRecord(0, record);
        model.submitAll();
    }
}
           

這段代碼中,我們首先找到 age = 25 的記錄,然後将 age 重新設定為 26,存入相同的位置(在這裡都是索引 0 的位置),送出之後完成一次更新。當然,我們也可以類似其它模型一樣的設定方式:setData() 函數。具體代碼片段如下:

if (model.select()) {
    if (model.rowCount() == 1) {
        model.setData(model.index(0, 2), 26);
        model.submitAll();
    }
}
           

注意我們的 age 列是第 3 列,索引值為 2,因為前面還有 id 和 name 兩列。這裡的更新操作則可以用如下 SQL 表示:

UPDATE student SET age = 26 WHERE age = 25
           

删除操作同更新類似:

QSqlTableModel model;
model.setTable("student");
model.setFilter("age = 25");
if (model.select()) {
    if (model.rowCount() == 1) {
        model.removeRows(0, 1);
        model.submitAll();
    }
}
           

如果使用 SQL 則是:

DELETE FROM student WHERE age = 25
           

當我們看到 removeRows() 函數就應該想到:我們可以一次删除多行。事實也正是如此,這裡不再贅述。

本文福利,莬費領取Qt開發學習資料包、技術視訊,内容包括(C++語言基礎,Qt程式設計入門,QT信号與槽機制,QT界面開發-圖像繪制,QT網絡,QT資料庫程式設計,QT項目實戰,QSS,OpenCV,Quick子產品,面試題等等)↓↓↓↓↓↓見下面↓↓文章底部點選莬費領取↓↓