我正在编写一个 Qt 应用程序,其中不同的模型可以插入/删除/更新同一个表。当一个模型更改数据库时,我希望其他模型能够收到更改通知,以便他们可以相应地更新其视图。
看来在 SQLite 中监控插入、删除和更新的最佳方法是使用QSqlDriver::subscribeToNotification
然后对通知信号做出反应。我知道语法是这样的:
db.driver()->subscribeToNotification("anEventId");
但是,我不确定什么anEventId
方法。是anEventId
SQLite 提供的常量,或者我是否使用触发器或其他东西将这些特定事件编码到 SQLite 中,然后订阅它们?
The subscribeToNotification
在Qt中的实现sqlite驱动程序依赖于sqlite3_update_hook https://www.sqlite.org/c3ref/update_hook.html的功能sqliteC API。然而,Qt 驱动程序并不转发所执行的操作,而只是转发表名,这应该就是神秘的事件 ID要传递给的参数subscribeToNotification
。简而言之,您可以监听任何表中发生的事件(假设它是一个rowid表 https://www.sqlite.org/rowidtable.html,但通常是)将表名传递给subscribeToNotification
方法。当您的插槽捕获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...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)