Qt SQLITE (Проблема с добавлением записей.)

Модератор: Модераторы разделов

Аватара пользователя
OwnerCoder
Сообщения: 186
ОС: OpenSuSe 11, Apple OS X 10.5.8

Qt SQLITE

Сообщение OwnerCoder »

Народ есть проблема (очень странная, может туплю я):
В общем есть код:

Код: Выделить всё

callkeeper::callkeeper(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    connect(ui.toolButton_Insert, SIGNAL(clicked()), this, SLOT(button_add_clicked()));
    db = QSqlDatabase::addDatabase("QSQLITE", "connection");
    db.setDatabaseName(qApp->applicationDirPath() + "/database.sqlite");
    if (!db.open()) {
        QMessageBox::critical(this, this->windowTitle(), tr("База данных не может быть открыта."));
        return;
    }
    if (!createDatabase())
        return;
    connectToTableView();
}

void callkeeper::button_add_clicked()
{
    DialogAddCall dialog(this);
    if (dialog.exec() != QDialog::Accepted)
        return;
    QString date    = dialog.getDate();
    QString time    = dialog.getTime();
    int type        = dialog.getTypeCall();
    QString fromto  = dialog.getFromTo();
    QString comment = dialog.getComment();
    if (fromto.isEmpty()) {
        QMessageBox::information(this, this->windowTitle(), tr("Не заполнено поле \"от кого/кому\"."));
        button_add_clicked();
    }
    QSqlQuery query("", db);
    QString sql = "INSERT INTO calls VALUES(NULL, '" + date + "', '" + time + "', "
                  "" + QString::number(type) + ", '" + fromto + "', '" + comment + "');";
    if (!query.exec(sql)) {
        QMessageBox::critical(this, this->windowTitle(), tr("Не возможно выполнить запрос."));
        return;
    }
    connectToTableView();
}

void callkeeper::connectToTableView()
{
    QSqlQuery query("SELECT `date_call`, `time_call`, `type_call`, `from_call`, `comment_call` FROM calls;",QSqlDatabase::database("connection"));
    model = new QStandardItemModel( ui.tableView );
    if (!query.exec()) {
        QMessageBox::critical(this, this->windowTitle(), tr("Не возможно выполнить запрос."));
        return;
    }
    int rows = query.numRowsAffected();
    model->insertColumns(0, 5);
    model->insertRows(0, rows);
    model->setHeaderData(0, Qt::Horizontal, tr("Дата"));
    model->setHeaderData(1, Qt::Horizontal, tr("Время"));
    model->setHeaderData(2, Qt::Horizontal, tr("Входящий/Исходящий"));
    model->setHeaderData(3, Qt::Horizontal, tr("От кого/Кому"));
    model->setHeaderData(4, Qt::Horizontal, tr("Комментарий"));
    query.first();
    for (int i = 0; i < rows; ++i) {
        model->setData(model->index(i, 0), query.value(0).toString());
        model->setData(model->index(i, 1), query.value(1).toString());
        model->setData(model->index(i, 2), query.value(2).toString());
        model->setData(model->index(i, 3), query.value(3).toString());
        model->setData(model->index(i, 4), query.value(4).toString());
        query.next();
    }
    ui.tableView->setModel(model);
    ui.tableView->setSortingEnabled(true);
    ui.tableView->resizeColumnsToContents();
}

bool callkeeper::createDatabase()
{
    QSqlQuery query(QSqlDatabase::database("connection"));
    QString sqlQuery = "CREATE TABLE IF NOT EXISTS calls(i integer primary key autoincrement, date_call varchar, time_call varchar, type_call integer, from_call varchar, comment_call varchar);";
    if (!query.exec(sqlQuery)) {
        QMessageBox::critical(this, this->windowTitle(), tr("Не возможно создать таблицу."));
        return false;
    }
    return true;
}


А проблема в том что таблица создается а при добавлении записей добавляется только одно запись и все, после завершения программы база становится пустой, как будтто в неё ниче и не добавляли. Помогите разобраться плз...
Спасибо сказали:
alfss
Сообщения: 262

Re: Qt SQLITE

Сообщение alfss »

Спасибо сказали:
Аватара пользователя
OwnerCoder
Сообщения: 186
ОС: OpenSuSe 11, Apple OS X 10.5.8

Re: Qt SQLITE

Сообщение OwnerCoder »


Не помогает, я вообще не пойму что это такое, главное пример sqlBrowser все отлично выполняет правда там все это делается через QSqlQueryModel.
Спасибо сказали:
alfss
Сообщения: 262

Re: Qt SQLITE

Сообщение alfss »

Если даже после каждого query.exec делать query.finish???
А по окончании работы db.close??
Спасибо сказали:
Аватара пользователя
OwnerCoder
Сообщения: 186
ОС: OpenSuSe 11, Apple OS X 10.5.8

Re: Qt SQLITE

Сообщение OwnerCoder »

alfss писал(а):
01.10.2008 13:22
Если даже после каждого query.exec делать query.finish???
А по окончании работы db.close??

Делал такое, мне чет вообще не нравится такое! :( С мускулом все ок!
Спасибо сказали:
Аватара пользователя
OwnerCoder
Сообщения: 186
ОС: OpenSuSe 11, Apple OS X 10.5.8

Re: Qt SQLITE

Сообщение OwnerCoder »

Забыл сказать что любой sqlitebrowser показывает все записи которые я добавляю! А вот сама прога не может их просмотреть.
Спасибо сказали:
alfss
Сообщения: 262

Re: Qt SQLITE

Сообщение alfss »

то есть если сделать sqlite database.sqlite и select * from calls;
то данные видны?
Спасибо сказали:
Аватара пользователя
OwnerCoder
Сообщения: 186
ОС: OpenSuSe 11, Apple OS X 10.5.8

Re: Qt SQLITE

Сообщение OwnerCoder »

alfss писал(а):
01.10.2008 18:07
то есть если сделать sqlite database.sqlite и select * from calls;
то данные видны?

Не сильно тебя понял! Я нашел выход след:

Код: Выделить всё

    if (!db.isOpen())
        cout << "Db is not open." << endl;
    QSqlQueryModel *model = new QSqlQueryModel(ui.tableView);
    model->setQuery(QSqlQuery("SELECT `date_call`, `time_call`, `type_call`, `from_call`, `comment_call` FROM calls;", db));
    model->setHeaderData(0, Qt::Horizontal, tr("Дата"));
    model->setHeaderData(1, Qt::Horizontal, tr("Время"));
    model->setHeaderData(2, Qt::Horizontal, tr("Входящий/Исходящий"), Qt::EditRole);
    model->setHeaderData(3, Qt::Horizontal, tr("От кого/Кому"));
    model->setHeaderData(4, Qt::Horizontal, tr("Комментарий"));
    int numRows = model->rowCount();
    for(int i =0;i < numRows;i++) {
        cout << QString::number(model->flags(model->index(i,2))) << endl;
        if (model->data(model->index(i,2)).toInt() == 0) {
            model->setData(model->index(i,2), QString(tr("Входящий")), Qt::EditRole);
        }
        if (model->data(model->index(i,2)).toInt() == 1) {
                cout << model->setData(model->index(i,2), QString(tr("Исходящий")), Qt::EditRole) << endl;
        }
    }
    ui.tableView->setModel(model);
    ui.tableView->setSortingEnabled(true);
    ui.tableView->resizeColumnsToContents();

Так все выводится правда не могу разобраться с флагами, чтобы setData разрешить изменение данных в QSqlQueryModel
Спасибо сказали:
Аватара пользователя
OwnerCoder
Сообщения: 186
ОС: OpenSuSe 11, Apple OS X 10.5.8

Re: Qt SQLITE

Сообщение OwnerCoder »

Все со всем разобрался, все работает! :)
Значит как я понял с sqlite лучьше не парится с QSqlQuery а использовать QSqlQueryModel для запросов типа SELECT.
Спасибо сказали: