java model类数据库_Qt数据库(5) - 使用SQL Model类

Qt助手关键字:Using the SQL Model Classes

Qt Version 5.14.0

除了QSqlQuery,Qt还提供了三个高级类用来访问数据库,分别为QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel。

QSqlQueryModel 基于任意SQL语句的只读模型

QSqlTableModel 只对一张表进行操作的读写模型

QSqlRelationalTableModel QSqlTableModel的子类,支持外键

这三个类继承自QAbstractTableModel,这使得在ItemView类(比如QTableVIew、QListView、QTreeView)中显示数据库中的数据变得很简单。具体细节详见Qt助手关键字:Presenting Data in a Table View。

The SQL Query Model

QSqlQueryModel提供一个只读模型,该模型数据基于SQL query。示例代码如下:

QSqlQueryModel model;

model.setQuery("SELECT * FROM employee");

设置完SQL语句之后,可以使用record(int)函数来访问单独的记录,代码如下:

for (int i = 0; i < model.rowCount(); ++i)

{

int id = model.record(i).value("id").toInt();

QString name = model.record(i).value("name").toString();

qDebug() << id << name;

}

也可以使用从QAbstractItemModel继承的接口来访问model中的数据。 setQuery()接口还有一个重载函数,可以接收QSqlQuery对象作为参数,这样就可以利用QSqlQuery所有特性,比如占位符。

The SQL Table Model

QSqlTableModel提供一次只作用于一张表的可读写模型。示例代码如下:

QSqlTableModel model;

model.setTable("employee");

model.setFilter("salary > 50000");

model.setSort(2, Qt::DescendingOrder);

model.select();

for (int i = 0; i < model.rowCount(); ++i)

{

QString name = model.record(i).value("name").toString();

int salary = model.record(i).value("salary").toInt();

qDebug() << name << salary;

}

用代码修改表中数据的流程如下:

获取某一行record:model.record(i)

修改record中某个字段对应的数据:record.setValue("字段名", 值)

替换model中对应位置record:model.setRecord()

也可以使用从QAbstractItemModel继承的接口data()和setData(),以下代码调用setData接口完成model中的数据刷新:

model.setData(model.index(row, column), 75000);

model.submitAll();

数据插入

model.insertRows(row, 1);

model.setData(model.index(row, 0), 1013);

model.setData(model.index(row, 1), "Peter Gordon");

model.setData(model.index(row, 2), 68500);

model.submitAll();

删除5行连续数据

model.removeRows(row, 5);

model.submitAll();

修改何时生效

当你修改记录时,需要调用QSqlTableModel::submitAll()来保证修改已经被写入数据库。而何时调用这个函数取决于QSqlTableModel的编辑策略

QSqlTableModel::OnFieldChange:无缓存,一有修改立刻写入数据库

SqlTableModel::OnRowChange:缓存某一行修改,当你选择其它行时,之前的修改立刻写入数据库

QSqlTableModel::OnManualSubmit:缓存所有修改,直到手动调用submitAll()或revertAll()

注意:对于新插入行,OnFieldChange行为与OnRowChange一致。

The SQL Relational Table Model

QSqlRelationalTableModel对QSqlTableModel进行了扩展,提供了外键支持。

8760954624f215a3cfb2206f05ce3db2.png

如上图,左表使用QSqlTableModel,第三、四列存储的是另一个地址表的主键,不利于阅读。右表使用QSqlRelationalTableModel,可以将地址表的主键自动替换成某个其它字段,便于阅读。 示例代码如下:

model->setTable("employee");

model->setRelation(2, [QSqlRelation](qsqlrelation.html)("city", "id", "name"));

model->setRelation(3, [QSqlRelation](qsqlrelation.html)("country", "id", "name"));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值