qt學習筆記(九)之資料庫_初窺使用者介面層

來源:互聯網
上載者:User

前面兩節主要介紹SQL介面層,這節我們來初窺使用者介面層。

在之前已經說了使用者介面層提供從資料庫資料到使用者資料表示的表單的映射。

除了QSqlQuery類外,Qt還提供了三種用於訪問資料庫的高層類。

類名 用途
QSqlQueryMdoel 基於任意SQL語句的唯讀模型
QSqlTableModel 基於單個表的讀寫模型
QSqlReltionalTableModel QSqlTableModel的子類,增加了外鍵支援

這三個類在不涉及資料庫庫的圖形表示時可以單獨使用,進行資料庫操作。同時也可以作為資料來源映射到QListView和QTableView等基於視圖模式的Qt類中表示出來。

下面的代碼是在上一節的基礎上添加的。

1、QSqlQueryMdoel

    QSqlQueryModel *model = new QSqlQueryModel();    model->setQuery("SELECT table_user.user_id, table_group.group_name FROM table_group,"                    "table_user WHERE table_group.group_id=table_user.group_id");        for(int i = 0; i < model->rowCount(); i++)    {        qDebug() << model->record(i).value("user_id").toString();        qDebug() << model->record(i).value("group_name").toString();    }

這段代碼使用了多表查詢,目的是得到工號和對應組別的資料。

這裡順帶提一提SQLite 多表查詢的方法。

多表查詢方法:

sqlite3可以有多種多表查詢方法,比如  select (select * from table2)  from table1 where xxx=xxx;

select table1.abc from table1,table2 where table1.xxx=table2.xxx;

或這種

select table1.abc from table1 inner join table2 on table1.xxx=table2.xxx;

在使用QSqlQueryModel::setQuery()進行查詢語句的設定後(執行後得到查詢結果集),我們就可以使用record(i)訪問每一條單獨的記錄了。

2、QSqlTableModel

    QSqlTableModel tablemodel;      //單表查詢    tablemodel.setTable("table_user");  //綁定表    tablemodel.setFilter("group_id=1"); //設定查詢條件    tablemodel.select();                //查詢    for(int i = 0; i < tablemodel.rowCount(); i++)    {        qDebug() << tablemodel.record(i).value(1).toString();    }

QSqlTableModel的使用也比較簡單。注意的一點是,他只能操作單個表。

因為table_user表只有2個欄位。所以通過value()指定欄位索引的時候,直接寫了索引值。在操作大量資料的時候,最好通過索引指定欄位。如:

int UserID_Index = tablemodel.record().indexOf("user_id");qDebug() << tablemodel.record(i).value(UserID_Index).toString();

或者

 tablemodel.record(i).value("user_id").toString();

注意,一定要調用select()。否則不能得到查詢結果集

3、QSqlReltionalTableModel

    QSqlRelationalTableModel *model = new QSqlRelationalTableModel();    model->setTable("table_user");    model->setRelation(1, QSqlRelation("table_group", "group_id", "group_id")); //表明table_group.group_id是table_group的主鍵    model->setHeaderData(0, Qt::Horizontal, tr("工號"));    model->setHeaderData(1, Qt::Horizontal, tr("組別"));    if(!model->select())    {        QMessageBox::critical(this, tr("錯誤提示"), model->lastError().text(), QMessageBox::Cancel);    }

QSqlReltionalTableModel的用法和QSqlTableModel大同小異。第四行和第五行的作用相當為model的表頭指定列設定名稱(相當於資料庫欄位的別名)

在這裡附上程式原始碼下載連結:qt_資料庫_初窺使用者介面層
以上純屬個人學習筆記,如果哪裡錯了,希望提出。願和大家一起共同學習,一起進步。我的郵箱地址是:xzy@yingzhi8.com

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.