前一章咱們使用 SQL 語句完成了對數據庫的常規操做,包括簡單的 CREATE、SELECT 等語句的使用。咱們也提到過,Qt 不只提供了這種使用 SQL 語句的方式,還提供了一種基於模型的更高級的處理方式。這種基於QSqlTableModel
的模型處理更爲高級,若是對 SQL 語句不熟悉,而且不須要不少複雜的查詢,這種QSqlTableModel
模型基本能夠知足通常的需求。本章咱們將介紹QSqlTableModel
的通常使用,對比 SQL 語句完成對數據庫的增刪改查等的操做。值得注意的是,QSqlTableModel
並不必定非得結合 QListView
或QTableView
使用,咱們徹底能夠用其做通常性處理。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()
函數就應該想到:咱們能夠一次刪除多行。事實也正是如此,這裏再也不贅述。