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

时间:2018-09-06 12:38:51

标签: c++ qt sqlite notifications

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

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

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

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

1 个答案:

答案 0 :(得分:2)

Qt sqlite 驱动程序中的subscribeToNotification实现依赖于 sqlite C API的sqlite3_update_hook函数。但是,Qt驱动程序不会转发已执行的操作,仅转发表名,而该转发应该是传递给subscribeToNotification的错误的 anEventId 参数。简而言之,您可以侦听将表名传递给subscribeToNotification方法的任何表中发生的事件(假定它是rowid table,但通常是)。但是,当您的插槽捕获到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...