0
点赞
收藏
分享

微信扫一扫

2. Java基本语法

飞进科技 1小时前 阅读 0

【QSqlTableModel】数据库的高级API

描述

QSqlTableModel是用于从单个表读取和写入数据库记录的高级接口。它构建在较低级别的QSqlQuery之上,可用于为视图类(如QTableView)提供数据。例如:

    QSqlTableModel *model = new QSqlTableModel;
    model->setTable("employee");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();
    model->setHeaderData(0, Qt::Horizontal, tr("Name"));
    model->setHeaderData(1, Qt::Horizontal, tr("Salary"));

    QTableView *view = new QTableView;
    view->setModel(model);
    view->hideColumn(0); // don't show the ID
    view->show();

我们设置SQL表的名称和编辑策略,然后设置显示在视图标题中的标签。编辑策略规定了用户在视图中所做的更改实际应用于数据库的时间。可能的值有OnFieldChange、OnRowChange和OnManualSubmit。
QSqlTableModel也可以用于以编程方式访问数据库,而无需将其绑定到视图:

QSqlTableModel model;
    model.setTable("employee");
    model.select();
    int salary = model.record(4).value("salary").toInt();

上面的代码片段从来自employee的查询SELECT* 的结果集中的记录4中提取了salary字段。
可以使用setFilter()设置筛选器,也可以使用setSort()修改排序顺序。最后,您必须调用select()来用数据填充模型。
QSqlTableModel不直接支持外键。如果要解析foreign key,请使用QSqlRelationalTableModel和QSqlRelationalDelegate。
注:foreign key就是表与表之间的某种约定的关系,由于这种关系的存在,能够让表与表之间的数据,更加的完整,关联性更强。

tablemodel示例说明了如何使用QSqlTableModel作为QTableView的数据源。
实例如下:

成员类型的文档

enum QSqlTableModel::EditStrategy

枚举类型描述了当在数据库中编辑值时的选择策略。

目录Value描述
QSqlTableModel::OnFieldChange0模型所有的改变都立即应用到数据库中
QSqlTableModel::OnRowChange1当用户选择一个不同的行,行的更改将被应用
QSqlTableModel::OnManualSubmit2所有更改都将缓存在模型中,直到调用submitAll()或revertAll()为止。

为了防止在数据库中只插入部分初始化的行,对于新插入的行,OnFieldChange的行为将类似于OnRowChange。

成员函数

信号(signal)

QSqlTableModel::QSqlTableModel(QObject *parent = nullptr, QSqlDatabase db = QSqlDatabase())
//创建一个空的QSqlTableModel,并将父对象设置为父对象,将数据库连接设置为db。如果数据库无效,将使用默认的数据库连接。默认的编辑方法是OnRowChange.
void QSqlTableModel::beforeDelete(int row)
//在从当前活动的数据库表中删除行之前,deleteRowFromTable()会发出他的信号。
void QSqlTableModel::beforeInsert(QSqlRecord &record)
//在将新行插入当前活动的数据库表之前,insertRowIntoTable()会发出此信号。将要插入的值存储在记录中,并且可以在插入之前进行修改。
void QSqlTableModel::beforeUpdate(int row, QSqlRecord &record)
//在使用记录中的值更新当前活动数据库表中的行之前,updateRowInTable()会发出此信号。
//请注意,只有标记为已生成的值才会更新。生成的标志可以用QSqlRecord::setGenerated()设置,也可以用QSqlRecord::isGenerated()检查。
void QSqlTableModel::primeInsert(int row, QSqlRecord &record)
//当在当前活动数据库表的给定行中启动插入时,insertRows()会发出此信号。记录参数可以写入(因为它是一个引用),例如用默认值填充一些字段,并设置字段的生成标志。在处理此信号时,不要试图通过其他方式(如setData()或setRecord())编辑记录。
void QSqlTableModel::revert()重载虚函数
//当用户取消编辑当前行时,项代理将调用此重新实现的槽。
//如果模型的策略设置为OnRowChange或OnFieldChange,则还原更改。对OnManualSubmit策略没有任何作用。
//使用revertAll()恢复OnManualSubmit策略的所有挂起更改,或使用revertRow()恢复特定行。
void QSqlTableModel::revertAll()
//恢复所有挂起的更改。
bool QSqlTableModel::select()
//使用指定的筛选器和排序条件,使用通过setTable()设置的表中的数据填充模型,如果成功,则返回true;否则返回false。
bool QSqlTableModel::selectRow(int row)
//使用与主键值匹配的数据库表行中的值刷新模型中的行。如果没有主键,则所有列值都必须匹配。如果没有找到匹配的行,则模型将显示一个空行。如果成功,则返回true;否则返回false。
bool QSqlTableModel::submit()
//当用户停止编辑当前行时,项代理将调用此重新实现的槽。
//如果模型的策略设置为OnRowChange或OnFieldChange,则提交当前编辑的行。对OnManualSubmit策略没有任何作用。
//使用submitAll()提交OnManualSubmit策略的所有挂起的更改。
//成功时返回true;否则返回false。使用lastError()查询详细的错误信息。
//不会自动重新填充模型。提交的行在成功时从数据库中刷新。
bool QSqlTableModel::submitAll()
//提交所有挂起的更改,并在成功时返回true。错误时返回false,可以使用lastError()获取详细的错误信息。
//在OnManualSubmit中,成功后将重新填充模型。任何呈现它的视图都将丢失其选择。
//注意:在OnManualSubmit模式下,submitAll()失败时,不会从缓存中清除已提交的更改。这允许在不丢失数据的情况下回滚和重新提交事务。
void QSqlTableModel::clear() == void QSqlQueryModel::clear()
//清除模型并释放所有获取的资源
QVariant QSqlTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
//返回特定的值,对于index和role,如果错误或者index溢出,返回无效的QVariant.
QSqlDatabase QSqlTableModel::database() const
//返回数据库的连接
bool QSqlTableModel::deleteRowFromTable(int row)
//从当前数据库表中删除给定的行
//这是一个直接在数据库上操作的低级方法,不应直接调用。使用removeRow()或removeRows()删除值。模型将根据其编辑策略决定何时修改数据库。
//如果行被删掉,返回true,其他返回false
QSqlTableModel::EditStrategy QSqlTableModel::editStrategy() const
//返回当前的编辑策略
int QSqlTableModel::fieldIndex(const QString &fieldName) const
//返回字段fileName的索引,如果模型中不存在相应的字段,则返回-1.
QString QSqlTableModel::filter() const
//返回当前设置的筛选器
Qt::ItemFlags QSqlTableModel::flags(const QModelIndex &index) const
//返回指定索引的项标志

QVariant QSqlTableModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const
//返回标头中指定方向部分中给定角色的标头数据。
QModelIndex QSqlTableModel::indexInQuery(const QModelIndex &item) const
//返回模型中给定项的数据库结果集中值的索引。
//如果没有插入、删除或移动任何列或行,则返回值与item相同。
//如果item超出边界或item没有指向结果集中的值,则返回无效的模型索引。
bool QSqlTableModel::insertRecord(int row, const QSqlRecord &record)
//在位置行插入记录。如果row为负数,则将该记录追加到末尾。
//内部调用insertRows()和setRecord()。如果记录可以插入,则返回true,否则返回false。

bool QSqlTableModel::insertRowIntoTable(const QSqlRecord &values)
//将值插入到当前活动的数据库表中。这是一个直接在数据库上操作的低级方法,不应该直接调用。
//使用insertRow()和setdata)来插入值。模型将根据其编辑策略决定何时修改数据库。
//如果值可以插入,则返回true,否则返回false。可以使用lastError()检索错误信息。

bool QSqlTableModel::insertRows(int row, int count, const QModelIndex &parent = QModelIndex())
//插入行
bool QSqlTableModel::isDirty(const QModelIndex &index) const
//脏数据是数据表中存在错误、不一致或无效的数据行。会导致数据查询、分析和处理的不准确性和不稳定性。
//数据是否为脏数据
QString QSqlTableModel::orderByClause() const
//根据当前设置的排列顺序返回SQL ORDDER BY子句。
QSqlIndex QSqlTableModel::primaryKey() const
//返回当前表的主键,如果没有设置主键,则返回空QSQLIndex。
QSqlRecord QSqlTableModel::primaryValues(int row) const
//返回一条记录,该记录包含主键中表示的字段,并设置为第一行的值,如果没有定义主键,返回的记录将包含所有字段
QSqlRecord QSqlTableModel::record() const
//检索记录的字段名
QSqlRecord QSqlTableModel::record(int row)
//返回模型中第一行的记录,如果row是有效行的索引,则将使用该行的值填充记录
bool QSqlTableModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())
//从父模型中删除计数列,从索引列开始。返回列是否已成功删除;否则返回false。
bool QSqlTableModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex())
//移除行,从row开始的Count行
void QSqlTableModel::revertRow(int row)
//还原指定行的所有更改。
int QSqlTableModel::rowCount(const QModelIndex &parent = QModelIndex()) const
//返回行数
bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
void QSqlTableModel::setEditStrategy(QSqlTableModel::EditStrategy strategy)
//将编辑数据库中值的策略设置为策略。这将恢复任何挂起的更改。

void QSqlTableModel::setFilter(const QString &filter)
//将当前过滤器设置为过滤。
//筛选器是一个不带关键字WHERE的SQL WHERE子句(例如,name='Josephine')。
//如果模型已经用数据库中的数据填充,则模型会使用新的过滤器重新选择它。否则,下次调用select()时将应用该筛选器。
void QSqlTableModel::setPrimaryKey(const QSqlIndex &key)
//受保护的方法,允许子类将主键设置为键。
//通常,无论何时调用setTable(),都会自动设置主索引。
void QSqlTableModel::setQuery(const QSqlQuery &query)

bool QSqlTableModel::setRecord(int row, const QSqlRecord &values)
//将值应用于模型中的行。源字段和目标字段是按字段名称映射的,而不是按记录中的位置映射的。
//请注意,值中生成的标志将被保留,以确定在将更改提交到数据库时是否使用相应的字段。默认情况下,对于QSqlRecord中的所有字段,它都设置为true。必须对值中的任何值使用setGenerated(false)将标志设置为false,才能将更改保存回数据库。
//对于编辑策略OnFieldChange和OnRowChange,只有当没有其他行具有缓存的更改时,行才能接收到更改。更改将立即提交。提交的更改在失败时不会恢复。
//如果可以设置所有值,则返回true;否则返回false。

void QSqlTableModel::setSort(int column, Qt::SortOrder order)
//设置要排序的列的排序顺序。这不会影响当前数据,要使用新的排序顺序刷新数据,请调用select()。
void QSqlTableModel::setTable(const QString &tableName)
//将模型操作的数据库表设置为tableName。不从表中选择数据,而是获取其字段信息。
//要用表的数据填充模型,请调用select()。
//可以使用lastError()检索错误信息。
void QSqlTableModel::sort(int column, Qt::SortOrder order)
//按照排序顺序按列对数据进行排序。这将立即选择数据,使用setSort()设置排序顺序,而不使用数据填充模型。

QString QSqlTableModel::tableName() 
//返回当前所选表的名称。
bool QSqlTableModel::updateRowInTable(int row, const QSqlRecord &values)
//使用指定的值更新当前活动数据库表中的给定行。如果成功,则返回true;否则返回false。
//这是一个直接在数据库上操作的低级方法,不应直接调用。使用setData()更新值。模型将根据其编辑策略决定何时修改数据库。
//请注意,只有设置了生成标志的值才会更新。
//生成的标志可以用QSqlRecord::setGenerated()设置,也可以用QSqlRecord::isGenerated(()测试。
举报

相关推荐

java 2.基本语法

2_Java简介及基本语法

Markdown(2)基本语法

java基本语法

Java基本语法

Java基础-基本语法

0 条评论