一、定义
数据库的数据模型是将SQL语句对数据库的访问完全对象化,将SQL语句的执行封装成对象及其成员函数的实现,同时也对象化了QT的表格界面,实现了数据库访问的高耦合性,屏蔽了数据库访问的内部细节,将数据库的访问简化成调用对象的接口(成员函数)。
二、QSqlTableModle类
成员函数:
1.绑定表格(数据库的表)
[virtual] void QSqlTableModel::setTable(const QString &tableName);
//传入表格名
2.插入
插入一条记录 ------- insertRecord
bool QSqlTableModel::insertRecord(int row, const QSqlRecord &record);
//先构建一条QSqlRecord,再插入指定行
插入一行 ----------- insertRow
bool QAbstractItemModel::insertRow(int row, const QModelIndex &parent = QModelIndex());
//传入第几行
3.提交模型数据到数据库 ----------- submit/submitAll
[override virtual slot] bool QSqlTableModel::submit();
[slot] bool QSqlTableModel::submitAll();
4.查询 ------------ select
[virtual slot] bool QSqlTableModel::select();
//每次查询前应该重新绑定表格,如果需要显示就绑定模型和表格界面
//查找也可以设置过滤器和排序方法
[virtual] void QSqlTableModel::setFilter(const QString &filter);
//传入的字符串格式类似于 "字段名=字段值"
[virtual] void QSqlTableModel::setSort(int column, Qt::SortOrder order);
//传入按哪一列,用什么方式排序
Qt::AscendingOrder ----- 升序
Qt::DescendingOrder ---- 降序
5.从模型中删除行 ---------- removeRow/removeRows
[override virtual] bool QSqlTableModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
//传入哪一行开始一共多少行
[override virtual] int QSqlTableModel::rowCount(const QModelIndex &parent = QModelIndex()) const;
//返回当前模型中的行数
bool QAbstractItemModel::removeRow(int row, const QModelIndex &parent = QModelIndex());
//删除指定行
6.修改 = 查询+插入
(1) select+record(…)+记录的setValue+setRecord
//如何获取QSqlRecord
QSqlRecord QSqlTableModel::record() const;//获取一条空记录
QSqlRecord QSqlTableModel::record(int row) const;//获取指定行的记录
//QSqlRecord的修改字段成员函数
void QSqlRecord::setValue(int index, const QVariant &val);//通过编号修改
void QSqlRecord::setValue(const QString &name, const QVariant &val);//通过字段名修改
//修改记录
bool QSqlTableModel::setRecord(int row, const QSqlRecord &values);//修改指定行的记录
(2) 直接修改模型中的数据 ------- setData
[override virtual] bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
//传入要修改的位置编号和内容
[override virtual] QModelIndex QAbstractTableModel::index(int row, int column, const QModelIndex &parent = ...) const;
//通过行和列获取index编号
7.撤销修改 ------ revert/revertAll
[override virtual slot] void QSqlTableModel::revert();
[slot] void QSqlTableModel::revertAll();
测试代码:
#include "smartsqlstu.h"
#include "ui_smartsqlstu.h"
#include <QMessageBox>
SmartSQLStu::SmartSQLStu(QWidget *parent)
: QWidget(parent)
, ui(new Ui::SmartSQLStu)
{
ui->setupUi(this);
//1.添加数据库驱动
db = QSqlDatabase::addDatabase("QSQLITE");
//2.指定数据库文件路径
db.setDatabaseName("stu.db");
//3.打开数据库
if(!db.open()){
QMessageBox::warning(this,"提示","打开数据库失败!");
}
//初始化模型
model = new QSqlTableModel(this);
}
SmartSQLStu::~SmartSQLStu()
{
delete ui;
}
//建表
void SmartSQLStu::on_pushButton_createtab_clicked()
{
QString sql = QString("create table if not exists %1(id int unique,name nvarchar,age int)")
.arg(ui->lineEdit_tabname->text());
//QSqlQuery执行sql
QSqlQuery query;
if(!query.exec(sql)){//失败
QMessageBox::warning(this,"提示","建表失败!");
return;
}
model->setTable(ui->lineEdit_tabname->text());
//设置提交后生效
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
//显示
model->select();
ui->tableView->setModel(model);
//禁止创建,使能操作
ui->lineEdit_tabname->setEnabled(false);
ui->pushButton_createtab->setEnabled(false);
ui->pushButton_add->setEnabled(true);
ui->pushButton_save->setEnabled(true);
ui->pushButton_delete->setEnabled(true);
ui->pushButton_revert->setEnabled(true);
ui->pushButton_select->setEnabled(true);
}
//添加
void SmartSQLStu::on_pushButton_add_clicked()
{
//获取当前的行数
int row = model->rowCount();
//在末尾插入一行
model->insertRow(row);
int id = 100;
model->setData(model->index(row,0),id);
//提交
model->submitAll();
}
//保存
void SmartSQLStu::on_pushButton_save_clicked()
{
model->submitAll();
}
//撤销
void SmartSQLStu::on_pushButton_revert_clicked()
{
model->revertAll();
}
//删除选中行
void SmartSQLStu::on_pushButton_delete_clicked()
{
//从表格中获取要删除的行
int delrow = ui->tableView->currentIndex().row();
//删除
model->removeRow(delrow);
//再次询问用户是否真的删除
if(QMessageBox::Yes==QMessageBox::warning(this,"删除","确定要删除吗?",QMessageBox::Yes|QMessageBox::No)){
model->submitAll();
}
else{
model->revertAll();
}
}
// 查询
void SmartSQLStu::on_pushButton_select_clicked()
{
model->setTable(ui->lineEdit_tabname->text());
model->select();
}
测试结果