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