如何使用Qt QSqlDriver::subscribeToNotification with SQLite3?

How to use Qt QSqlDriver::subscribeToNotification with SQLite3?

本文关键字:with SQLite3 subscribeToNotification Qt QSqlDriver 何使用      更新时间:2023-10-16

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

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

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

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

Qt sqlite 驱动程序中的subscribeToNotification实现依赖于sqliteC API 的sqlite3_update_hook函数。但是,Qt 驱动程序不会转发执行的操作,只会转发表名,这应该是传递给subscribeToNotificationanEventId参数。简而言之,您可以侦听任何表中发生的事件(假设它是一个 rowid 表,但通常是(,将表名传递给subscribeToNotification方法。但是,当您的插槽捕获到notification信号时,您只知道该表中发生了操作,但(遗憾的是(Qt不会告诉您是哪一个(插入,更新或删除(。

所以,给定一个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...