如何使用QSqlQueryModel从SQLite数据库中删除行

How to delete a row from SQLite database using QSqlQueryModel?

本文关键字:数据库 删除行 SQLite 何使用 QSqlQueryModel      更新时间:2023-10-16

我正试图从QSqlQueryModel中删除一行,如下所示:

void MainWindow::deleteRecord()
{
    int row_index= ui->tableView->currentIndex().row();
    model->removeRow(row_index);
}

但它不起作用。

我也尝试了以下方法:

void MainWindow::deleteRecord()
    {
        int row_index= ui->tableView->currentIndex().row();    
        if(!db_manager->delete_record(QString::number(row_no))){
            ui->appStatus->setText("Error: data deletion ...");
        } else{
            ui->appStatus->setText("Record deleted ...");
        }
    }

其中,在db_manager中,函数delete_recod(QString row_no)为:

bool DatabaseManager::delete_record(QString row_index)
{
    QSqlQuery query;
    query.prepare("DELETE FROM personal_Info WHERE ref_no =  (:ref_no)");
    query.bindValue(":ref_no",row_index);
    if (!query.exec())
    {
        qDebug() << "Error" << query.lastError().text();
        return false;
    }
    return true;
}

但也不起作用。在这两次尝试中,应用程序都没有崩溃,也没有SQLite错误。

我做错了什么?我该如何解决?

第一种方法失败,因为QSqlQueryModel没有实现removeRows您没有检查它的返回值(bad!bad!),它是false,表示失败。

它怎么可能实现行删除功能?您的SQL查询可以是任何东西,包括删除行没有任何意义的结果集。

相反,请考虑使用QSqlTableModel——它可能适用于您的案例,也可能不适用于您,但考虑到您的DELETE声明的形式,我认为它适用。(QSqlTableModel仅显示一个表/视图的竞争)。


第二种方法可能已经奏效了您没有看到UI更新这一事实并不意味着什么——您应该检查实际的数据库内容,看看DELETE语句是否真的起作用并删除了一些内容。

现在请注意,数据库中没有任何内容告诉Qt更新其视图。你需要建立基础设施。现代数据库支持触发器和信号系统(由QSqlDriver::notification封装在Qt中),可以用于此目的。在其他情况下,您必须手动触发SQL模型的刷新,例如通过调用QSqlTableModel::select()