VB
Қаз. 30, 2020, 4: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, 5:29 Т.Қ.
  • (өңделген)

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

    Алексей Внуков
    • Қаз. 30, 2020, 5:32 Т.Қ.
    • (өңделген)

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

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

      VB
      • Қаз. 30, 2020, 5:42 Т.Қ.
      • (өңделген)

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

        VB
        • Қаз. 30, 2020, 5:45 Т.Қ.
        • (өңделген)

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

          Алексей Внуков
          • Қаз. 30, 2020, 6: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, 7:01 Т.Қ.

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

              VB
              • Қаз. 30, 2020, 11:52 Т.Қ.
              • (өңделген)

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

              1. QList<Data*> items;

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

                VB
                • Қаз. 30, 2020, 11:59 Т.Қ.

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

                  Алексей Внуков
                  • Қар. 2, 2020, 4 Т.Қ.

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

                    Пікірлер

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