前面两节主要介绍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