Юрий
Юрий11 квітня 2017 р. 12:02

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

Qt

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

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

5
Evgenii Legotckoi
  • 11 квітня 2017 р. 12: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 р. 13:28

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

      Evgenii Legotckoi
      • 11 квітня 2017 р. 13:39

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

        Юрий
        • 11 квітня 2017 р. 13:48

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

        SELECT   `UPDATE_TIME`
         FROM  INFORMATION_SCHEMA.PARTITIONS
         WHERE   TABLE_NAME   = 'table'
        и сравнивать с ранее сохраненным значением?
          Evgenii Legotckoi
          • 11 квітня 2017 р. 14:05

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

            Коментарі

            Only authorized users can post comments.
            Please, Log in or Sign up
            AD

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:50бали,
            • Рейтинг балів-4
            m
            • molni99
            • 26 жовтня 2024 р. 01:37

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:80бали,
            • Рейтинг балів4
            m
            • molni99
            • 26 жовтня 2024 р. 01:29

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:20бали,
            • Рейтинг балів-10
            Останні коментарі
            ИМ
            Игорь Максимов22 листопада 2024 р. 11:51
            Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
            Evgenii Legotckoi
            Evgenii Legotckoi31 жовтня 2024 р. 14:37
            Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
            A
            ALO1ZE19 жовтня 2024 р. 08:19
            Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
            ИМ
            Игорь Максимов05 жовтня 2024 р. 07:51
            Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
            d
            dblas505 липня 2024 р. 11:02
            QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            Тепер обговоріть на форумі
            Evgenii Legotckoi
            Evgenii Legotckoi24 червня 2024 р. 15:11
            добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
            t
            tonypeachey115 листопада 2024 р. 06:04
            google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
            NSProject
            NSProject04 червня 2022 р. 03:49
            Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
            9
            9Anonim25 жовтня 2024 р. 09:10
            Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

            Слідкуйте за нами в соціальних мережах