VB
16 сентября 2020 г. 18: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;
- }
Спасибо за внимание!
3
17
Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Пожалуйста, авторизуйтесь или зарегистрируйтесь
- Последние комментарии
- AK1 апреля 2025 г. 11:41Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VP9 марта 2025 г. 16:14Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМ22 ноября 2024 г. 21:51Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Сейчас обсуждают на форуме
- МА1 апреля 2025 г. 16:210ff763fe-4e50-455d-a3a6-5699c243b1a5_17_44_22_1.xml
- f15 февраля 2025 г. 13:46Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
Добрый день.
Метод 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, на сколько помню, удаляет данные из поля, чтоб изменить размер и удалить пустые строки нужно доболнительно делать вакуум