VB
Vladimirsky BervinSept. 16, 2020, 8:23 a.m.

QSqlTableModel не удаётся редактировать и удалять данные

SQLite, QT

Добрый день.

Впервые решил использовать для создания базы данных связку модели и представления. За основу взял 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;
}

Исходный код

Спасибо за внимание!

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
5

Добрый день.

Метод update_in_db скорее всего не работает из-за наличия знаков каретки \n , а также из-за того, что нет bind для ID.

Что касается delete_from_db , то тут я не уверен, в чём может быть ошибка. Что вываливается в вывод qCritical?

VB

Да, редактирование теперь работает! Спасибо!
По поводу удаления, причина в том, что индекс в представлении отличается от id в базе. Нужно брать id для удаления из базы, а не из представления. Всё, задача решена!

Если через раз, то дело скорее всего в том, что обычно ID является автоинкрементируемым столбцом, который всегда растёт, даже если какие-то строки удалялись из базы данных. Если у вас было 4 записи с ID: 1, 2, 3, 4 и вы удалили 4-й, то следующий ID будет 5 и в таблице будут 1, 2, 3, 5.

В данном случае currentIndex.row() не отвечает ID, это просто номер строки в таблице. Вам нужно сначала получить ID записи, можно это сделать через метод data, просто нужно иметь столбки с ID, можно сделать его скрытым. А потом уже делать удаление по этому id

VB

А удаление всё же не работает. Понял это когда по аналогии с этим проектом создал проект с картинками. При удалении элементов размер базы данных не меняется. То есть в представлении элемент показываться не будет, но из базы данных по видимому не удаляется.

а проверить просто что находится в базе? и вообще SQLite, на сколько помню, удаляет данные из поля, чтоб изменить размер и удалить пустые строки нужно доболнительно делать вакуум

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting
p
  • pstMem
  • Nov. 28, 2020, 3:34 a.m.

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:70points,
  • Rating points1
p
  • pstMem
  • Nov. 27, 2020, 11:22 a.m.

C++ - Тест 003. Условия и циклы

  • Result:64points,
  • Rating points-1
q
  • qwerty
  • Nov. 27, 2020, 7:29 a.m.

C++ - Тест 003. Условия и циклы

  • Result:42points,
  • Rating points-8
Last comments
VR

QML - Lesson 016. SQLite database and the working with it in QML Qt

Помогите, пожалуйста. У меня похожая задача, но я в qml слой долен передать не чистый запрос, а со сложной обработкой, поэтому у меня в С++ слое есть иерархия классов, которая имитирует бд и зап…
e
  • eviza
  • Nov. 16, 2020, 4:32 a.m.

Qt/C++ - Tutorial 083. Creating a dynamic library and connecting it to another project

здравствуйте! при компиляции библиотеки выскакивает окно особая программа( не удалось найти программу, укажите путь к ней), и в папке debug создается файл .dll, а .lib нет. подскажите…
IB

Data encryption by RSA algorithm in Qt with public and private keys without binding to OpenSSL

Библиотека подключилась нормально, только на выводе из первого примера выходит пустое сообщение, вместо "test message" просто "". Никаких ошибок не выдает.
VS

Qt WinAPI - Lesson 002. How to make win installer for Qt apllication?

Можно ли как-то однозначно (не проверяя) выяснить, запустится ли программа в windows 7? И как быть с разрядностью уже и просто в w10 (32\64)?
DT

Django - Tutorial 036. How to add authentication through social networks. VKontakte

Возможно, автор прочитает. Делал авторизацию с помощью ВК по книге Дронова. Выдает ошибку "Backend not found". Стал гуглить, нашел вашу статью, вроде почти то же самое (оно и понятно, документа…
Now discuss on the forum
A

QSqlTableModel - Как добавить картинки в таблицу, чтобы они отражались в диалоговом окне, но не были частью модели

Source: //= по ссылке //= https://www.kontaktor.su/pd-nf-nfs-nasosy-irtysh.html Tags: насосы пд смотрите здесь kontaktor.su/pd-nf-nfs-nasosy-i…
s
  • solmik
  • Nov. 27, 2020, 12:44 p.m.

Обращение к ячейке таблицы

Спасибо, разобрался, у меня получилось немного не так, таблица создавалась в Qt Creator, рядом с таблицей поставил кнопку и вот слот обработки сигнала этой кнопки: void MainWindow::on…
m

Установка OpenSSL с QT Windows

К продолжению темы в QT 5.15.1 появились уже готовые libeay32.dll и ssleay32.dll на машине сборки все работает. На целевую машину в папку с exe подкидываю libeay32.dll и ssleay32.dll результата…
DK

QStyledItemDelegate не изменяются данные

Привет. Редактирую ячейку, нажимаю enter, либо просто кликаю на др место, но введенные данные возвращаются к тем, что были до редактирования. К примеру, меняю дату: 01.01.2000 было, редактирую 0…
m

Отправка JSON

Спасибо!
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB