Юрий
Сәуір 11, 2017, 10:02 Т.Қ.

Обновление модели по таймеру при изменении в БД

Qt

Как реализовать механизм обновления данных в QTableView при изменении в БД MySQL

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

5
Evgenii Legotckoi
  • Сәуір 11, 2017, 10:40 Т.Қ.
  • Жауап шешім ретінде белгіленді.

Ну, если вопрос по реализации обновления от таймера, то по сигналу просто делайте select в модели данных. Если конечно используется какая-нибудь модель данных типа QSqlTableModel , QSqlRealtionalTableModel или модель наследованная от этих моделей.

В заголовочном файле добавьте объект QTimer, можно причём сохранить в стеке, а не в куче через оператор new .

QTimer m_timer;

А если учесть, что метод select() у модели данных QSqlTableModel является публичным слотом, то можно напрямую сигнал от таймера подключить к этому методу. Тогда с определённой периодичностью будут обновляться данные, если они изменялись.

Вот например обновление раз в минуту:

m_timer;
connect(&m_timer, &QTimer::timeout, model, &QSqlTableModel::select);
m_timer.start(60 * 1000);

Модель данных должна быть установлена в QTableView . Чтобы узнать об изменениях в базе данных, нужно будет сделать выборку ( select() ). Сама БД никак не сообщит об этом.

    Юрий
    • Сәуір 11, 2017, 11:28 Т.Қ.

    Так я и сделал, но мне надо при изменении данных в таблице БД .

      Evgenii Legotckoi
      • Сәуір 11, 2017, 11:39 Т.Қ.

      Когда происходит изменение данных в таблице БД? При каких действиях. Они же не на пустом месте происходят? При изменении данных сторонними средствами? Сторонней программой? Или вашей же программой? Поподробнее никак нельзя объяснить проблему? Серебряной пули не бывает.

        Юрий
        • Сәуір 11, 2017, 11:48 Т.Қ.

        А если проверять значения с помощью

        SELECT   `UPDATE_TIME`
         FROM  INFORMATION_SCHEMA.PARTITIONS
         WHERE   TABLE_NAME   = 'table'
        и сравнивать с ранее сохраненным значением?
          Evgenii Legotckoi
          • Сәуір 12, 2017, 12:05 Т.Ж.

          Да. Это может сработать. Во всяком случае нагрузка может уменьшиться. Вместо того, чтобы тащить всю таблицу через select будете делать более экономичный запрос, но опять же по таймеру. Вообще у QSqlDriver есть возможность подписки на уведомления от базы данных. Метод subscribeToNotification , но вот тут уже проблема имеется в том, что MySQL не имеет механизма notify , то есть подписаться на уведомления от базы данных просто так не получится, вообще информации по MySQL на эту тему практически нет. А вот с PostgreSQL здесь в разы лучше ситуация. У него имеются уведомления, на которые можно подписаться, самые простые NOTIFY, LISTEN, UNLISTEN . Можно вроде как и на отдельные таблицы подписываться. Так что в случае с PostgreSQL это проще реализовать. Сама база данных будет этому способствовать. В случае же с MySQL - это таймеры и прочие костыли. Так что, если есть возможность сменить БД , то подумайте над этим.

            Пікірлер

            Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
            Кіріңіз немесе Тіркеліңіз