qt学习笔记(九)之数据库_初窥用户接口层

转载 2015年07月09日 16:44:36

前面两节主要介绍SQL接口层,这节我们来初窥用户接口层。

在之前已经说了用户接口层提供从数据库数据到用户数据表示的窗体的映射。

除了QSqlQuery类外,Qt还提供了三种用于访问数据库的高层类。

类名 用途
QSqlQueryMdoel 基于任意SQL语句的只读模型
QSqlTableModel 基于单个表的读写模型
QSqlReltionalTableModel QSqlTableModel的子类,增加了外键支持
这三个类在不涉及数据库库的图形表示时可以单独使用,进行数据库操作。同时也可以作为数据源映射到QListView和QTableView等基于视图模式的Qt类中表示出来。

下面的代码是在上一节的基础上添加的。

1、QSqlQueryMdoel

  1. QSqlQueryModel *model = new QSqlQueryModel();  
  2. model->setQuery("SELECT table_user.user_id, table_group.group_name FROM table_group,"  
  3.                 "table_user WHERE table_group.group_id=table_user.group_id");  
  4.   
  5. for(int i = 0; i < model->rowCount(); i++)  
  6. {  
  7.     qDebug() << model->record(i).value("user_id").toString();  
  8.     qDebug() << model->record(i).value("group_name").toString();  
  9. }  
这段代码使用了多表查询,目的是得到工号和对应组别的数据。

这里顺带提一提SQLite 多表查询的方法。

多表查询方法:

  1. sqlite3可以有多种多表查询方法,比如  select (select * from table2)  from table1 where xxx=xxx;  

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

或这种

  1. select table1.abc from table1 inner join table2 on table1.xxx=table2.xxx;  
在使用QSqlQueryModel::setQuery()进行查询语句的设置后(执行后得到查询结果集),我们就可以使用record(i)访问每一条单独的记录了。

2、QSqlTableModel

  1. QSqlTableModel tablemodel;      //单表查询  
  2. tablemodel.setTable("table_user");  //绑定表  
  3. tablemodel.setFilter("group_id=1"); //设置查询条件  
  4. tablemodel.select();                //查询  
  5. for(int i = 0; i < tablemodel.rowCount(); i++)  
  6. {  
  7.     qDebug() << tablemodel.record(i).value(1).toString();  
  8. }  
QSqlTableModel的使用也比较简单。注意的一点是,他只能操作单个表。

因为table_user表只有2个字段。所以通过value()指定字段索引的时候,直接写了索引值。在操作大量数据的时候,最好通过索引指定字段。如:

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

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

注意,一定要调用select()。否则不能得到查询结果集

3、QSqlReltionalTableModel

  1. QSqlRelationalTableModel *model = new QSqlRelationalTableModel();  
  2. model->setTable("table_user");  
  3. model->setRelation(1, QSqlRelation("table_group""group_id""group_id")); //表明table_group.group_id是table_group的主键  
  4. model->setHeaderData(0, Qt::Horizontal, tr("工号"));  
  5. model->setHeaderData(1, Qt::Horizontal, tr("组别"));  
  6.   
  7. if(!model->select())  
  8. {  
  9.     QMessageBox::critical(this, tr("错误提示"), model->lastError().text(), QMessageBox::Cancel);  
  10. }  

QSqlReltionalTableModel的用法和QSqlTableModel大同小异。第四行和第五行的作用相当为model的表头指定列设定名称(相当于数据库字段的别名)

相关文章推荐

qt学习笔记(七)之数据库简介

笔者最近用Qt写公司的考勤机。本来要求是要基于frameBuffer下用自己开发的easyGUI来进行上层应用开发,但是考虑到easyGUI提供的接口不是很多,就考虑用Qt来开发,顺带练练手。 废话不...

Qt编程—学习笔记——QSlite数据库使用总结

数据库的使用主要是创建数据库,创建数据库表,输入数据库数据,查看数据库数据,导出数据库数据。 首先最重要的是*.pro文件中添加 QT  += sql。在接下来使用什么函数,请自行添加相应的类。 (1...

QT sqlite3数据库读取、容器操作、文件读写——学习笔记。

直接上代码 #include "dbpoi.h" #include #include #include #include #include #include #include...
  • swqqcs
  • swqqcs
  • 2012年06月19日 21:04
  • 8612

Java学习笔记(JDBC数据库编程常用接口)

Path配置 通常问题有两方面,一方面是路径不对,另一方面是路径前后标点符号不对(英文半角): CLASSPATH   .;%JAVA_HOME%\lib;      ...

Hibernate学习笔记(3)——hibernate操作数据库的步骤和核心接口

用Hibernate建立与数据库的连接,要先做好以下准备: 1.创建实体类: 实体类(也称持久化类)是一个带有一些属性的JavaBean类,实体类对属性的存取方法(getter and setter...
  • zrw2012
  • zrw2012
  • 2013年07月21日 20:33
  • 729

SpringSecurity学习笔记(三)——自定义登录界面读取数据库用户以及权限

在SpringSecurity学习笔记(一)——入门篇中,在文末我们介绍了SpringSecurity如何使用自定义的登录界面,因为用户和权限都是写死的,所以相对本篇而言,简单很多,本文将介绍如何通过...

Qt学习笔记

  • 2013年05月02日 09:16
  • 161KB
  • 下载

QT学习笔记

  • 2015年01月30日 15:26
  • 2.5MB
  • 下载

Qt中SQL QSqlQuery 对象中prepare()函数的用法(初学者,学习笔记,还望指正)

本文主要说明了qt中数据库操作的prepare()函数用法。

qt经典学习笔记

  • 2008年05月06日 11:00
  • 1.33MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:qt学习笔记(九)之数据库_初窥用户接口层
举报原因:
原因补充:

(最多只允许输入30个字)