DELETE

时间:2016-11-22 14:02:56

标签: sql qt listview qml

我有以下课程

class SqlContactModel : public QSqlTableModel
{
    Q_OBJECT
public:
    SqlContactModel(QObject *parent = 0);
    Q_INVOKABLE void addContact( const QString& contactName );
    Q_INVOKABLE void removeContact( const QString& contactName );

    QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;
    QHash<int, QByteArray> roleNames() const Q_DECL_OVERRIDE;
};

用作ListView的模型。我有以下添加/删除方法的实现:

void SqlContactModel::addContact( const QString& contactName )
{
    QSqlRecord newRecord = record();
    newRecord.setValue("name", contactName);
    if (!insertRecord(rowCount(), newRecord)) {
        qWarning() << "Failed to send message:" << lastError().text();
        return;
    }

    submitAll();
}

void SqlContactModel::removeContact( const QString& contactName )
{
    QString sqlQueryString = QString("DELETE FROM Contacts WHERE name='") + contactName + QString("'");
    QSqlQuery query;
    if (!query.exec(sqlQueryString))
        qFatal(qPrintable(query.lastError().text()));
    submitAll();
}

最后在qml中我试图调用以下序列:

Component.onCompleted: {
   addContact("111");
   addContact("123")
   addContact("456")
   removeContactFromModel("456");
   console.log("contactsList.count = ", contactsList.count)
 }

但是我看到3个代表仍然在ListView中。与此同时,我发现我的数据库中只有2个条目。这种方法有什么问题?如何在每次添加/删除数据库中的项目时更新ListView?

最新的发现是,如果由于某种原因,在调用此onComplete之前联系人“111”和“123”已经在DB中,则会出现此问题。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您没有使用类的特定方法来删除行,请尝试使用:

bool removeRow(int row, const QModelIndex &parent = QModelIndex())

此方法实现了QT模型类的删除协议。

发出信号的另一种解决方案:

emit beginRemoveRows(const QModelIndex &parent, int first, int last);
YOUR CODE
emit endRemoveRows();

或者

emit beginResetModel();
YOURCODE
emit endResetModel();

希望这对你有所帮助。