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开发(四十九)——数据库用户接口层    用户接口层主要包括Qt SQL模块中的QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel。用户接...
  • A642960662
  • A642960662
  • 2017年03月26日 12:47
  • 250

2017最新VIP课程JavaScript面向对象及组件开发高清视频附源码课件

课程介绍: JS面向对象及组件开发系列课程主要内容: 一、面向对象基础主要讲解:什么是面向对象,编程的特点,基本写法和组成以及工厂方式与构造函数,使用面向对象编写选项卡及编写拖拽 二、JS面...
  • yiqizixueba
  • yiqizixueba
  • 2017年11月28日 22:53
  • 22

MYSQL之数据库初窥

mysql数据库 1、数据库简介    数据库概念:是按照数据结构来组织、存储和管理数据的仓库。 2、常用术语    数据库:是一些关联表的集合    数据表:表是数据的矩阵,在数据库中看起来像一个简...
  • a544258023
  • a544258023
  • 2015年08月20日 00:38
  • 955

QT初窥

      最近开始看QT的文档,发现了很多好东西,至少对于我来说 收获很多~~~       当然很多东西自己还不能理解的很透彻,也是和朋友讨论以后才渐渐清晰的,可能对于QT中一些经典的用意我还是存...
  • QustDong
  • QustDong
  • 2010年12月26日 20:07
  • 653

QT初窥续

看QT的文档,我有些小小的纠结。 因为很多东西都没看明白,可能是qt已经被封装的很强大了,想要弄明白就需要花更多的时间去体会他的用意了。 我的每一次收获,还得感谢网友们对我的热心指导~~~   再看Q...
  • QustDong
  • QustDong
  • 2011年01月03日 15:14
  • 813

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

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

Qt学习笔记(九)数据库

QSql模块提供了与平台以及数据库种类无关的访问SQL数据库的接口。这个接口由利用Qt的模型/视图结构将数据库与用户界面集成的一套类来支持。由于授权许可的限制,Qt的开源版本无法提供所有的驱动程序。当...
  • skc361
  • skc361
  • 2013年10月16日 14:13
  • 1198

FreeRTOS学习笔记-1-概述

FreeRTOS(读作”free-arr-toss”)是一个的开源实时嵌入式系统的操作系统,于2002由Richard Barry开发。 * 基本构造* 最小化的FreeRTOS内核只包含在3个与...
  • travel0er
  • travel0er
  • 2015年06月22日 11:44
  • 875

SDUT OJ 数据结构实验之链表九:双向链表

数据结构实验之链表九:双向链表 T                                                                                  ...
  • C_Lemon_
  • C_Lemon_
  • 2016年10月08日 19:04
  • 645

C语言 链表 数据结构实验之链表九:双向链表

数据结构实验之链表九:双向链表 Problem Description 学会了单向链表,我们又多了一种解决问题的能力,单链表利用一个指针就能在内存中找到下一个位置,这是一个不会轻易断裂的链。但...
  • zdadan
  • zdadan
  • 2018年01月22日 09:51
  • 48
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:qt学习笔记(九)之数据库_初窥用户接口层
举报原因:
原因补充:

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