【Qt筆記】使用模型操做數據庫

前一章咱們使用 SQL 語句完成了對數據庫的常規操做,包括簡單的 CREATE、SELECT 等語句的使用。咱們也提到過,Qt 不只提供了這種使用 SQL 語句的方式,還提供了一種基於模型的更高級的處理方式。這種基於QSqlTableModel 的模型處理更爲高級,若是對 SQL 語句不熟悉,而且不須要不少複雜的查詢,這種QSqlTableModel模型基本能夠知足通常的需求。本章咱們將介紹QSqlTableModel的通常使用,對比 SQL 語句完成對數據庫的增刪改查等的操做。值得注意的是,QSqlTableModel並不必定非得結合 QListViewQTableView使用,咱們徹底能夠用其做通常性處理。sql

 

首先咱們來看看如何使用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宏進行遍歷。code

另外須要注意,因爲QSqlTableModel只是一種高級操做,確定沒有實際 SQL 語句方便。具體來講,咱們使用QSqlTableModel只能進行 SELECT * 的查詢,不能只查詢其中某些列的數據。索引

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

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 表示:it

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

當咱們取出了已經存在的數據後,對其進行修改,而後從新寫入數據庫,即完成了一次更新操做:class

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()函數。具體代碼片斷以下:foreach

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

注意咱們的 age 列是第 3 列,索引值爲 2,由於前面還有 id 和 name 兩列。這裏的更新操做則能夠用以下 SQL 表示:List

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()函數就應該想到:咱們能夠一次刪除多行。事實也正是如此,這裏再也不贅述。

相關文章
相關標籤/搜索