Qt:通过视图更新数据库模型

Qt: updating database model through view

当我尝试通过视图更新 SQLite 数据库时遇到了一个奇怪的行为。根据我使用的编辑策略,我可以更新视图或更新数据库,但我无法更新数据库并让视图显示新值。

基本上,我使用以下代码:

auto sdb = QSqlDatabase::addDatabase("QSQLITE");
sdb.setDatabaseName("database.db");

QSqlTableModel *model = new QSqlTableModel(0, sdb);
model->setTable("table");

//model->setEditStrategy(QSqlTableModel::OnFieldChange);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();

QTableView *tv = new QTableView();
tv->setModel(model);
tv->show();

// I'm not sure, this connect statement is needed.
// Either way, it does not change the behavior of the problem I observe
connect(model,
        SIGNAL(dataChanged(const QModelIndex &,
                           const QModelIndex &,
                           const QVector<int> &)),
        tv,
        SLOT(dataChanged(const QModelIndex &,
                         const QModelIndex &,
                         const QVector<int> &)));

当我使用QSqlTableModel::OnManualSubmit

视图发生变化,但基础数据库没有更新。 IE。重新启动应用程序(或重新加载数据库)不会更新该字段。我想这很明显,因为我必须手动 'submit' 对基础数据库的更改。

当我使用QSqlTableModel::OnFieldChange

编辑视图后按回车键后,视图(针对编辑的行)变为空白。底层数据库得到更新,我可以在数据库中看到,但不知何故视图没有获得新值。

看来我的问题是 SQLite 数据库中的其中一列缺少 'PRIMARY KEY'。通过编辑视图,数据库可以成功更新,但不知何故更改没有正确转发到视图

创建一个新的 table 并将其中一个列作为主键,问题就解决了。