LINUX.ORG.RU

почему с QSqlRelationalTableModel данные не сохраняются?

 


0

1

отображается все верно, но при нажитии на сохранить данные не сохраняются : - (

class MyView: public QTableView {
Q_OBJECT
public:
    MyView(QWidget * parent = 0);
public slots:
    void saveData();
};

class MyWidget: public QWidget { 
Q_OBJECT
    QSqlRelationalTableModel *model;
    MyView *view;
public:
    MyWidget(QWidget *parent = 0);
};

MyWidget::MyWidget(QWidget *parent): QWidget(parent){
    QVBoxLayout * layout = new QVBoxLayout;
    setLayout(layout);

    model = new QSqlRelationalTableModel(this);
    model->setTable("testtable");
    model->setRelation(0, QSqlRelation("dict", "dict_id", "name"));
    model->select(); 
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);

    view = new MyView;
    view->setModel(model);
    view->setItemDelegate(new QSqlRelationalDelegate(view));
    layout->addWidget(view,5);

    QPushButton *bSave = new QPushButton(QObject::tr("&Сохранить"));
    QObject::connect(bSave,SIGNAL(clicked()),view,SLOT(saveData()));
    layout->addWidget(bSave,1);
}

MyView::MyView(QWidget *parent): QTableView(parent){}

void MyView::saveData(){
    if(((QSqlTableModel *) model())->submitAll()) qDebug() << "ok" ;
}

база вот такая

CREATE TABLE "dict" (    
    "dict_id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "name" varchar(20) NOT NULL
);
CREATE TABLE "testtable" (
    "dict_id" integer,
    "value" real NOT NULL,
    FOREIGN KEY(dict_id) REFERENCES dict
);

INSERT INTO dict ("name") VALUES ("A");
INSERT INTO dict ("name") VALUES ("B");

INSERT INTO testtable VALUES ("1",2.2);
INSERT INTO testtable VALUES ("2",6.6);

Твой view MyView точно ничего не кэширует у себя там? Пробовал со стандартной вьюхой?

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

Твой view MyView точно ничего не кэширует у себя там? Пробовал со стандартной вьюхой?

а что я потерял во вьюхе?

P.S. Если QSqlRelationalTableModel заменить на QSqlTableModel, то работает и сохраняет

developer-cpp
() автор топика
Ответ на: комментарий от grondek

А там база ни на что не ругается?

а как проверить?

вот так пойдет:

void MyView::saveData(){
    if(((QSqlTableModel *) model())->submitAll()) qDebug() << "ok" ;
    qDebug() << ((QSqlTableModel*)model())->lastError().text();
}

при нажатии на сохранить

ok 
" " 

developer-cpp
() автор топика
Ответ на: комментарий от developer-cpp

У тебя в testtable нет первичного ключа, по документации он обязан быть.

Странно, что у тебя не ругалось при сохранении. Я протестировал на PostgreSQL - у меня выдавало ошибку, пока не сделал первичный ключ. Потом все сохранялось.

Мелкое замечяние. Вот тут ...((QSqlTableModel *) model())->... надо использовать qobject_cast< QSQlTableModel*>( model() ).

grondek
()
Ответ на: комментарий от developer-cpp

Вообще, кстати, обязательное наличие ключа в таблице для QSqlRelationalTableModel довольно логично. Должна же модель как-то понимать, какая запись в таблице поменялась и куда все сохранять.

grondek
()
Ответ на: комментарий от grondek

QSqlTableModel как-то понимает же в отличие от QSqlRelationalTableModel. Вообще, это требование мешает иногда, у меня была история, когда я пытался QSqlRelationalTableModel использовать на вьюхе, и ничего не вышло.

unC0Rr ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.