qt之sql删除间隔大量数据

一、前言

上篇文章分享了如何上传存储大量数据,然后对应的就是删除,一般查看数据都是将数据显示在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 - 博客园

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大桶矿泉水

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值