QSqlTableModel: don't cache unchanged value in setData()

This is good for performance in terms of avoiding unnecessary
database activity and keeping the cache smaller.

Detail:
This change was not included in the big refactoring of QSqlTM. The
idea was that the model shouldn't second guess the intention of the
application and maybe the application wants to cause a submit.
It was a marginal consideration.

Now I think it's clear that our interest in not unnecessarily
expanding the cache outweighs that. In addition, applications can now
call selectRow() if they worry that the database values for the row
have changed and want to set a value back again.

Test added.

Change-Id: I63814dcb63a96c6ba1c8cc227807725a954a0b68
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Reviewed-by: David Faure <david.faure@kdab.com>
bb10
Mark Brand 2012-09-28 10:10:29 +02:00 committed by The Qt Project
parent 838eadba0b
commit 10ff9de91b
2 changed files with 14 additions and 0 deletions

View File

@ -542,6 +542,9 @@ bool QSqlTableModel::isDirty(const QModelIndex &index) const
For OnRowChange, an index may receive a change only if no other
row has a cached change. Changes are not submitted automatically.
Returns true if \a value is equal to the current value. However,
the value will not be submitted to the database.
Returns true if the value could be set or false on error, for
example if \a index is out of bounds.
@ -562,6 +565,9 @@ bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, in
if (!(flags(index) & Qt::ItemIsEditable))
return false;
if (QSqlTableModel::data(index, role) == value)
return true;
QSqlTableModelPrivate::ModifiedRow &row = d->cache[index.row()];
if (row.op() == QSqlTableModelPrivate::None)

View File

@ -1146,6 +1146,14 @@ void tst_QSqlTableModel::isDirty()
QVERIFY_SQL(model, select());
QFAIL_SQL(model, isDirty());
// check that setting the current value does not add to the cache
{
QModelIndex i = model.index(0, 1);
QVariant v = model.data(i, Qt::EditRole);
QVERIFY_SQL(model, setData(i, v));
QFAIL_SQL(model, isDirty());
}
if (submitpolicy != QSqlTableModel::OnFieldChange) {
// setData() followed by revertAll()
QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));