1、分页思想借鉴网友:五十一、Qt之通用数据库分页_panchang199266的博客-CSDN博客_qt数据库分页查询
2、使用sqllite数据库进行测试:创建一个测试用表student并插入100万条数据,使用事务进行插入,插入时间大概是1.6s:
{
QSqlDatabase db;
db = QSqlDatabase::addDatabase("QSQLITE", "main");
db.setDatabaseName("zzc.db");
if(!db.open())
{
qDebug() << "open error" << db.lastError();
}
QSqlQuery query(db);
QString strSql = QString("create table student (id integer primary key autoincrement,"
"grade int,"
"age int);");
if(!query.exec(strSql))
{
qDebug() << "create table" << db.lastError();
}
QVariantList var_grade_list, var_age_list;
query.prepare(QObject::tr("insert into student(grade, age) values(?,?)"));
for (int i = 0; i < 1000000;i++) {
var_age_list << QRandomGenerator::global()->bounded(10, 20);
var_grade_list << QRandomGenerator::global()->bounded(60, 120);
}
query.addBindValue(var_grade_list);
query.addBindValue(var_age_list);
//使用事务,实现快速批量插入
QDateTime dtStart = QDateTime::currentDateTime();
db.transaction();
if(!query.execBatch()){
qDebug() << query.lastError();
db.rollback();
}
db.commit();
QDateTime dtEnd = QDateTime::currentDateTime();
double msec = dtStart.msecsTo(dtEnd);
this->ui->Time->setText(QString("插入用时 %1 秒").arg(QString::number(msec / 1000, 'f', 3)));
}
QSqlDatabase::removeDatabase("main");
3、 主要思路:(1)、先查询表中总的数据行数,再根据每页显示的数据行数,计算出所需要的分页的数目;(2)、通过分页查询语句(关键字:limit)来查询并显示数据;(3)、使用模型视图模式来显示查询出来的数据。
4、需要注意多线程查询时,QSqlDatabase db变量不能跨线程使用,这根QT的版本有关,我是用的是QT5.13是不能跨线程使用的,所以我在每个线程中创建一个连接,使用完后调用:QSqlDatabase::removeDatabase("main");关闭连接,如下面,【注意db的作用域】:
{
QDateTime dtStart = QDateTime::currentDateTime();
QSqlDatabase db;
db = QSqlDatabase::addDatabase("QSQLITE", "main");
db.setDatabaseName("zzc.db");
if(!db.open())
{
qDebug() << "open error" << db.lastError();
}
//......SQL操作......
}
QSqlDatabase::removeDatabase("main");