Qt操作数据库模式之一QSqlQueryModel
- Qt操作数据库的几个层次
- 1、Qt SQL模块简介
- 2、驱动层
- 3、SQL接口层
- 4、用户接口层
- 5、数据库操作抽象层级
- 创建数据库
- 查询记录
- 条件查询1
- 条件查询--时间范围
Qt操作数据库的几个层次
1、Qt SQL模块简介
QT通过Qt SQL模块提供了对SQL数据库的支持,Qt SQL模块中的API分为三层:驱动层、SQL接口层、用户接口层。
如果要使用Qt SQL模块中的类,需要在工程文件(.pro文件)中添加QT += sql代码。
2、驱动层
驱动层为具体的数据库和SQL接口层之间提供了底层的桥梁,主要类包括Qt SQL模块中的QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase、QSqlDriverPlugin和QSqlResult。
3、SQL接口层
SQL接口层提供了对数据库的访问,主要类包括Qt SQL模块中的QSqlDatabase、QSqlQuery、QSqlError、QSqlField、QSqlIndex和QSqlRecord。QSqlDatabase类用于创建数据库连接,QSqlQuery用于使用SQL语句实现与数据库交互。
4、用户接口层
用户接口层主要包括Qt SQL模块中的QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel。用户接口层的类实现了将数据库中的数据链接到窗口部件上,是使用模型/视图框架实现的,是更高层次的抽象,即便不熟悉SQL也可以操作数据库。需要注意的是,在使用用户接口层的类之前必须先实例化QCoreApplication对象。
5、数据库操作抽象层级
- SQL语句直接操作,对应于QSqlQuery,这种操作下,直接构造sql语句,通过exec、execBatch、QRecord等操作获取结果;
- 只读模式的QSqlQueryModel,这种操作下,可以与 QTableView视图结合,自动显示操作结果;
- 更高抽象层次下的QSqlTableModel、QSqlRelationalTableModel,在QSqlQueryModel模式下,如果不重载SetData等方法,QTableView视图中的记录是无法编辑的,而QSqlTableModel、QSqlRelationalTableModel就是封装了视图记录可以编辑的方法。
创建数据库
查询记录
bool MainWindow::dbCreate(QString tableName)
{
QStringList drivers = QSqlDatabase::drivers();
foreach (QString str, drivers) {
qDebug() << str;
}
//创建数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "mydb1");
db.setDatabaseName(".//xyzDb.db"); //创建数据库
if (!db.open()){
qDebug() << "add database error:" << db.lastError();
return false;
}
//先判断对应的表是否存在,若不存在则创建对应的表
QSqlQuery query(db);
QStringList tables = db.tables();
if (! tables.contains(tableName, Qt::CaseInsensitive)){
bool Flag = query.exec(QString("create table '%1'(id int primary key,time varchar(30),xdata double,ydata double,zdata double)").arg(tableName));
if (Flag){
qDebug() << QObject::tr("create table success!\n");
return true;
}
else {
qDebug() << QObject::tr("create table failed\n");
return false;
}
}
//注意 ‘%1’ 单引号不要少 tablename可以是中文
return true;
}
条件查询1
void MainWindow::on_pBtnFilter_clicked()
{
QString str = ui->lineEditName->text();
QSqlDatabase db = QSqlDatabase::database("mydb1");
QSqlQueryModel *model = new QSqlQueryModel;
QString sqlStr = QString("select *from student where name = '%1'").arg(str);
model->setQuery(sqlStr, db);
ui->tableView->setModel(model);
}
条件查询–时间范围
void MainWindow::on_pBtnSelect_clicked()
{
QString strDateTimeFrom = ui->dateTimeEdit_From->dateTime().toString("yyyy-MM-dd HH:mm:ss");
QString strDateTimeTo = ui->dateTimeEdit_To->dateTime().toString("yyyy-MM-dd HH:mm:ss");
QSqlDatabase db = QSqlDatabase::database("mydb1");
QSqlQueryModel *model = new QSqlQueryModel;
QString sqlStr = QString("select * from xyzdata where time >= '%1' and time <= '%2'").arg(strDateTimeFrom).arg(strDateTimeTo);
model->setQuery(sqlStr, db);
ui->tableView->setModel(model);
}