VB
30 октября 2020 г. 16:32

Лишние строки при выборке из базы данных SQLite

Добрый день. Надеюсь, кто-то знает ответ.
Почему если в модели унаследованной от QSqlTableModel в следующем коде использовать

  1. setQuery(qry);

то в представлении появляются пустые строчки, которые в целом не мешают, но их становится всё больше и больше.
Если же использовать вместо этого

  1. beginResetModel();
  2. endResetModel();

то, лишних строчек нет.

Сам код

  1. void Model::selectAll()
  2. {
  3. items->clear();
  4. QSqlQuery qry;
  5. qry.prepare(
  6. "SELECT \n"
  7. " id, \n"
  8. " code, \n"
  9. " date, \n"
  10. " person, \n"
  11. " description \n"
  12. " FROM myDB \n"
  13. " ORDER BY code DESC; \n"
  14. );
  15.  
  16. if(qry.exec()){
  17. while(qry.next()){
  18. Data *item = new Data(this, qry);
  19. addItem(item);
  20. }
  21. } else {
  22. qCritical() << "Cannot execute query!";
  23. QSqlError err = qry.lastError();
  24. qCritical() << err.nativeErrorCode();
  25. qCritical() << err.databaseText().toUtf8().data();
  26. qCritical() << err.driverText().toUtf8().data();
  27. qDebug() << qry.executedQuery();
  28. }
  29.  
  30. // setQuery(qry);
  31. beginResetModel();
  32. endResetModel();
  33. }

Причем если вставить qDebug() << Items->Id();, то количество элементов будет то, какое должно быть.

3

Вам это нравится? Поделитесь в социальных сетях!

9
ИП
  • 30 октября 2020 г. 17:29
  • (ред.)

Как-то странно Вы используйте наследование от QSqlTableModel и еще используйте в нем QSqlQuery...
А чем обычный QSqlTableModel не устраивает для вывода всех данных из обной таблицы?

    Алексей Внуков
    • 30 октября 2020 г. 17:32
    • (ред.)

    а как вообще создаете модель? и зачам вам там обьект класса Data и что это за класс? если в базе нет пустых строк, то скорее всего у вас ошибки в реализации модели. и почему наследываетесь от QSqlTableModel а не от тойже QSqlQueryModel?

    и вообще, как и в каких целях планируете использовать модель?

      VB
      • 30 октября 2020 г. 17:42
      • (ред.)

      QSqlTableModel не удаётся редактировать и удалять данные - вот здесь есть исходный код прототипа этого проекта. ( Код )
      Класс Data содержит данные. Наследуюсь от QSqlTableModel, так как меняю данные в базе данных, добавляю элементы и редактирую их, удаление почему-то не работает. Класс QSqlQueryModel, как я понял, больше подходит для отображения данных, а не для редактирования.

        VB
        • 30 октября 2020 г. 17:45
        • (ред.)

        Я практик, правил не знаю, если код работает, то хорошо. Данный проект работает без видимых ошибок. Проблему лишних строк решил заменой, о которой в данном посте написал. Я просто хочу понять почему всё же лишние строки образуются. В базе данных 288 элементов и уже 32 лишние строки.

          Алексей Внуков
          • 30 октября 2020 г. 18:49
          • (ред.)

          все равно моя не понимать.
          во первых зачем делать перенос на новую строку после каждого слова в запросе? некоторые БД могут не корректно отработать запрос только от того что он не так создался, а лишние символы уж подавно

          1. "SELECT \n"
          2. " id, \n"
          3. " code, \n"
          4. " date, \n"
          5. " person, \n"
          6. " description \n"
          7. " FROM myDB \n"
          8. " ORDER BY code DESC; \n"

          во вторых: чем вас не устоил, как уже было замечено, стандартнй QSqlTableModel? что вы пытаетесь сделать с Data, и зачем он нужен? QSqlTableModel позволяет на прямую редактировать.
          вы всеравно выполняете редактирование и сохранение в обход QSqlTableModel. зачем вы на столько усложняете себе код?

          1. bool Model::save_to_db(Data *item)
          2. {
          3. QSqlQuery query;
          4. query.setForwardOnly(true);
          5.  
          6. query.prepare("INSERT INTO myDB (code, date, person, description)"
          7. "VALUES (:code, :date, :person, :description)");
          8.  
          9. query.bindValue(":code", item->Code());
          10. query.bindValue(":date", item->Date());
          11. query.bindValue(":person", item->Person());
          12. query.bindValue(":description", item->Description());
          13.  
          14. if(query.exec()) return true;
          15.  
          16. qCritical() << query.lastError().databaseText();
          17. qCritical() << query.lastError().driverText();
          18. qCritical() << query.lastError().nativeErrorCode();
          19.  
          20. return false;
          21. }
            Алексей Внуков
            • 30 октября 2020 г. 19:01

            без знаниния теории, или хотяб чаще заглядывать в документацию - практика большого опыта не даст. толк от написанного когда когда вы не понимаете что там написано и как работает? или не использовать полную силу метода, а писать костыли на то что уже есть и работает на 2-х строчках кода? без изучения теории Вы всегда будет делать много лишней работы и тратить время

              VB
              • 30 октября 2020 г. 23:52
              • (ред.)

              Не понятно что значит редактировать и добавлять в обход QSqlTableModel. Как я понял, процесс добавления или редактирования, это сначала добавляем и редактируем модель, потом добавляем или редактируем базу. В моём коде это последовательно и делается. База же не поменяется, если я отредактирую только модель. А Data это класс экземпляра данных. В модели список указателей и методов.

              1. QList<Data*> items;

              Доступ к элементу данных и переопределённые методы QSqlTableModel для вывода в представление.
              Редактирую элемент в списке, затем произвожу изменения в базе. Какая еще может быть логика?

                VB
                • 30 октября 2020 г. 23:59

                Ну вообще совсем без знания документации трудно что-либо написать. Я просмотрел видеокурс по моделям в Qt, несколько видеоуроков. Немного почитал документацию. Понятно, что где-то не понятно как использовать все возможности класса QSqlTableModel.

                  Алексей Внуков
                  • 2 ноября 2020 г. 16:00

                  можно сразу редактируя ячейку в виджете, будет редактироваться запись в базе. и тогда не нужны все манипуляции с классом Data

                    Комментарии

                    Только авторизованные пользователи могут публиковать комментарии.
                    Пожалуйста, авторизуйтесь или зарегистрируйтесь
                    • Последние комментарии
                    • IscanderChe
                      12 апреля 2025 г. 17:12
                      Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
                    • AK
                      1 апреля 2025 г. 11:41
                      Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                    • Evgenii Legotckoi
                      9 марта 2025 г. 21:02
                      К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                    • VP
                      9 марта 2025 г. 16:14
                      Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                    • ИМ
                      22 ноября 2024 г. 21:51
                      Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…