zl程序教程

您现在的位置是:首页 >  工具

当前栏目

qt之sql删除间隔大量数据

QtSQL数据 删除 大量 间隔
2023-09-27 14:29:08 时间

一、前言

上篇文章分享了如何上传存储大量数据,然后对应的就是删除,一般查看数据都是将数据显示在table中,然后执行各种操作,删除也是同样,但是如果想要实现跨越行和大量删除,方法如下:

二、环境

qt5.7 mingw windows8

三、正文

    ///获取选中的多行排序列表
     std::vector<int> vecItemIndex;//保存选中行的索引
     QItemSelectionModel *selections = ui->tableWidget_2->selectionModel(); //返回当前的选择模式
     QModelIndexList selectedsList = selections->selectedRows(); //返回行选定的模型项目索引列表  selectedIndexes所有模式,行列全在
     for (int i = 0; i < selectedsList.count(); i++)
         vecItemIndex.push_back(selectedsList.at(i).row());
     std::sort(vecItemIndex.begin(), vecItemIndex.end());
     vecItemIndex.erase(std::unique(vecItemIndex.begin(), vecItemIndex.end()), vecItemIndex.end());
     for (int i = 0; i < selectedsList.count(); i++)
     {
         //qDebug()<<"aaa="<<vecItemIndex[i];
     }
     ///多行删除判断选中方式
     if(selectedsList.count()<=0)
         massage_dialog(1,"警告","请选中想要删除的行在执行操作");
     else
     {
         if(massage_dialog(3,"警告","确定删除选中数据吗?") == true)
         {
         }
         else
         {
//             QSqlTableModel *model = new QSqlTableModel(NULL, db);
//             model->setTable("data");//执行sql查询
//             model->setEditStrategy(QSqlTableModel::OnManualSubmit);
//             model->select();
             QSqlQuery qry(db);
             QString sql;
             for (int j = 0; j < selectedsList.count(); j++)
             {
                 QCoreApplication::processEvents(QEventLoop::AllEvents);
                 ui->deletechoose->setText(tr("删%1/%2").arg(j+1).arg(selectedsList.count()));
                 //qDebug()<<"vecItemIndex[j]="<<datetime.at(vecItemIndex[j]);
                 //寻找id在数据库中的行
                 /*sql="select * from data";
                 if(qry.exec(sql)){
                       for(int i=0;qry.next()&&i<10000000;i++){
                           if(qry.value(0).toString()==compare_id){
                             row_forsql=i;//行数
                             break;
                           }
                       }
                       //qDebug()<<"row_forsql="<<row_forsql;
                 }
                 model->removeRow(row_forsql);
                 model->submitAll();//否则提交,在数据库中删除该行*/
                 sql=QString("delete from data where time = %1").arg(datetime.at(vecItemIndex[j]));
                 qry.prepare(sql);
                 qry.exec();
             }
             //重新刷新表格...
             massage_dialog(1,"提示","数据删除成功!");
         }
         ui->tableWidget_2->clearSelection();
         ui->deletechoose->setText("删除");//恢复按键提示
     }

上面代码中也是有两种方式,一个是QSqlTableModel 方式,还有一个是SQL语句方式,采用delete方法很明显第二种方式效率更高一些。

但是数据库删除之后,其申请的内存不会自动释放,保留成为碎片,此时需要vacuum功能进行空间释放,执行代码如下,测试中可发现,数据在删除后,其文件大小可跟随变小了。

    QSqlQuery qry(db);
    QString sql=tr("delete from history where time = '%1'").arg(name);
    qry.prepare(sql);
    qry.exec();
    qry.prepare("vacuum");//删除成功之后释放内存碎片
    qry.exec();

 方式二:一个表中相同条件均会被删除,不用循环删除

QSqlQuery qry(db);//数据库删除
qry.exec(QString("delete from Sys_user where name = '%1' and password = '%2';").arg(res1).arg(res2));
qry.exec(QString("delete from All_user where teacher = '%1';").arg(res1));
qry.exec("vacuum");//删除成功之后释放内存碎片

四、结语

更多语句及方式参照Qt之操作数据库(SQLite) - Avatarx - 博客园