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

时间:2017-07-20 08:43:47

标签: c++ qt sqlite model-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

视图更改,但基础数据库不会更新。即重新启动应用程序(或重新加载数据库)没有更新字段。我猜这是显而易见的,因为我必须手动提交&#39;对基础数据库的更改。

当我使用QSqlTableModel::OnFieldChange

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

1 个答案:

答案 0 :(得分:0)

似乎我的问题是缺少的主要关键&#39;在SQLite数据库的其中一列上。通过编辑视图,可以成功更新数据库,但不知何故,更改未正确转发到视图

创建一个新表,其中一列是主键,解决了问题。