如何在SQLite3中使用Qt QSqlDriver :: subscribeToNotification?

问题描述 投票:2回答:1

我正在编写一个Qt应用程序,其中不同的模型可以插入/删除/更新同一个表。当一个模型更改数据库时,我希望其他模型通知更改,以便他们可以相应地更新其视图。

似乎在SQLite中监视插入,删除和更新的最佳方法是使用QSqlDriver::subscribeToNotification然后对通知信号作出反应。我知道语法是这样的:

db.driver()->subscribeToNotification("anEventId");

但是,我不确定anEventId是什么意思。 anEventId是SQLite提供的常量还是使用触发器或其他东西将这些特定事件编码到SQLite中然后订阅它们?

c++ qt sqlite notifications
1个回答
2
投票

Qt sqlite驱动程序中的subscribeToNotification实现依赖于sqlite C API的sqlite3_update_hook函数。但是,Qt驱动程序不转发执行的操作,只转发表名,这应该是传递给subscribeToNotification的神奇的anEventId参数。简而言之,您可以监听任何表中发生的事件(假设它是rowid table,但通常是这样)将表名传递给subscribeToNotificationmethod。但是当你的插槽捕获notification信号时,你只知道该表中发生了一个操作,但是(遗憾的是)Qt不会告诉你哪一个(INSERT,UPDATE或DELETE)。

所以,鉴于QSqlDriver * driver

driver->subscribeToNotification("mytable1");
driver->subscribeToNotification("mytable2");
driver->subscribeToNotification("mytable3");

然后在你的插槽中:

void MyClass::notificationSlot(const QString &name)
{
    if(name == "mytable1")
    {
        // do something
    }
    else if(name == "mytable2")
    {

    //etc...
© www.soinside.com 2019 - 2024. All rights reserved.