VB
Vladimir Bervin16 сентября 2020 г. 8:23
QSqlTableModel не удаётся редактировать и удалять данные
Добрый день.
Впервые решил использовать для создания базы данных связку модели и представления. За основу взял SQLite. Класс Model унаследован от QSqlTableModel. Способ подключения базы данных и связки модели с представлением взял с этого сайта, немного изменив. Но, к сожалению, не работает обновление данных и удаление. Чтобы я ни делал, не получается. Может кто-нибудь знает решение?
Вот этот метод работает:
bool Model::save_to_db(Data *item) { QSqlQuery query; query.setForwardOnly(true); query.prepare("INSERT INTO myDB (code, date, person, description)" "VALUES (:code, :date, :person, :description)"); query.bindValue(":code", item->Code()); query.bindValue(":date", item->Date()); query.bindValue(":person", item->Person()); query.bindValue(":description", item->Description()); if(query.exec()) return true; qCritical() << query.lastError().databaseText(); qCritical() << query.lastError().driverText(); qCritical() << query.lastError().nativeErrorCode(); return false; }
Вот этот не работает (данные добавляются в представление, но не в базу):
bool Model::update_in_db(Data *item) { QSqlQuery query; query.setForwardOnly(true); query.prepare("UPDATE myDB SET \n" " code = :code, \n" " date = :date, \n" " person = :person, \n" " description = :description \n" "WHERE id = :id; \n" ); query.bindValue(":code", item->Code()); query.bindValue(":date", item->Date()); query.bindValue(":person", item->Person()); query.bindValue(":description", item->Description()); if(query.exec()) { return true; } else { qCritical() << query.lastError().databaseText(); qCritical() << query.lastError().driverText(); qCritical() << query.lastError().nativeErrorCode(); return false; } }
И удаление не работает:
Model::delete_from_db() { QSqlQuery query; query.setForwardOnly(true); query.prepare("DELETE FROM myDB WHERE id = :ID ;"); query.bindValue(":ID", currentIndex.row());//индекс сигналом по клику //передаю из MainWindow, так как представление находится в классе MainWindow if(!query.exec()){ qCritical() << query.lastError().databaseText().toUtf8().data(); qCritical() << query.lastError().driverText(); qCritical() << query.lastError().nativeErrorCode(); return false; } else { return true; } return false; }
Спасибо за внимание!
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Пожалуйста, авторизуйтесь или зарегистрируйтесь
OI
- Ora Iro
- 24 декабря 2024 г. 14:38
C++ - Тест 001. Первая программа и типы данных
- Результат:40баллов,
- Очки рейтинга-8
Последние комментарии
ИМ
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Игорь Максимов22 ноября 2024 г. 19:51
Evgenii Legotckoi31 октября 2024 г. 21:37
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь Максимов5 октября 2024 г. 14:51
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
Evgenii Legotckoi24 июня 2024 г. 22:11
t
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
tonypeachey115 ноября 2024 г. 14:04
NSProject4 июня 2022 г. 10:49
Добрый день.
Метод update_in_db скорее всего не работает из-за наличия знаков каретки \n , а также из-за того, что нет bind для ID.
Что касается delete_from_db , то тут я не уверен, в чём может быть ошибка. Что вываливается в вывод qCritical?
Да, редактирование теперь работает! Спасибо!
По поводу удаления, причина в том, что индекс в представлении отличается от id в базе. Нужно брать id для удаления из базы, а не из представления. Всё, задача решена!
Если через раз, то дело скорее всего в том, что обычно ID является автоинкрементируемым столбцом, который всегда растёт, даже если какие-то строки удалялись из базы данных. Если у вас было 4 записи с ID: 1, 2, 3, 4 и вы удалили 4-й, то следующий ID будет 5 и в таблице будут 1, 2, 3, 5.
В данном случае currentIndex.row() не отвечает ID, это просто номер строки в таблице. Вам нужно сначала получить ID записи, можно это сделать через метод data, просто нужно иметь столбки с ID, можно сделать его скрытым. А потом уже делать удаление по этому id
А удаление всё же не работает. Понял это когда по аналогии с этим проектом создал проект с картинками. При удалении элементов размер базы данных не меняется. То есть в представлении элемент показываться не будет, но из базы данных по видимому не удаляется.
а проверить просто что находится в базе? и вообще SQLite, на сколько помню, удаляет данные из поля, чтоб изменить размер и удалить пустые строки нужно доболнительно делать вакуум