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 хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Г
- Геній
- 13 сентября 2024 г. 12:46
C++ - Тест 001. Первая программа и типы данных
- Результат:66баллов,
- Очки рейтинга-1
t
- torgaev_2024
- 8 сентября 2024 г. 6:20
C++ - Тест 001. Первая программа и типы данных
- Результат:33баллов,
- Очки рейтинга-10
Последние комментарии
Как Копировать Файлы в Linux Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
ВР
Как Копировать Файлы в Linux Screenshot_20240802-065123.png
Влад Русоков2 августа 2024 г. 1:47
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Анатолий Кононенко5 февраля 2024 г. 1:50
Сейчас обсуждают на форуме
Evgenii Legotckoi24 июня 2024 г. 15:11
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT25 июня 2024 г. 1:00
BlinCT5 мая 2024 г. 5:46
Evgenii Legotckoi2 мая 2024 г. 14:07
Добрый день.
Метод 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, на сколько помню, удаляет данные из поля, чтоб изменить размер и удалить пустые строки нужно доболнительно делать вакуум