Как использовать Qt QSqlDriver :: subscribeToNotification с SQLite3? - PullRequest
0 голосов
/ 06 сентября 2018

Я пишу приложение Qt, где разные модели могут вставлять / удалять / обновлять одну и ту же таблицу. Когда одна модель изменяет базу данных, я хотел бы, чтобы другие модели были уведомлены об изменении, чтобы они могли соответствующим образом обновить свои представления.

Похоже, что лучший способ отслеживать вставки, удаления и обновления в SQLite - это использовать QSqlDriver::subscribeToNotification, а затем реагировать на сигнал уведомления. Я знаю, что синтаксис выглядит следующим образом:

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

Однако я не уверен, что означает anEventId. Является ли anEventId константой, предоставляемой SQLite, или я кодирую эти конкретные события в SQLite, используя триггеры или что-то еще, а затем подписываюсь на них?

1 Ответ

0 голосов
/ 06 сентября 2018

Реализация subscribeToNotification в драйвере Qt sqlite основана на функции sqlite3_update_hook API sqlite C. Драйвер Qt, однако, не перенаправляет выполненную операцию, просто имя таблицы , и это должен быть загадочный аргумент anEventId для передачи на subscribeToNotification. Короче говоря, вы можете прослушивать события, происходящие в любой таблице (если это таблица rowid , но обычно это так), передавая имя таблицы в метод 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...
...