SubmitAll() не работает с QSqlRelationalTableModel

'Всем привет,

У меня есть форма с табличным представлением, представляющим QSqlRelationalTableModel и виджеты, связанные с одной и той же моделью через QDataWidgetMapper.

Вот структура таблицы:

queryString = QString("CREATE TABLE t100000_Stations ("
                      "RecordID     INTEGER PRIMARY KEY AUTOINCREMENT,"
                      "StationID    TEXT UNIQUE, "
                      "ProjectID    TEXT, "
                      "LocalName    TEXT, "
                      "StationType  TEXT REFERENCES t911000_StationTypes(StationType), " // We have to link station type to a table (maybe parameters)
                      "Easting      DOUBLE NOT NULL, "
                      "Northing     DOUBLE NOT NULL, "
                      "Latitude     DOUBLE, "
                      "Longitude    DOUBLE, "
                      "LatLonDatum  TEXT, "
                      "CoordinateSystem  TEXT, "
                      "Elevation    DOUBLE, "
                      "ElevationType  INTEGER REFERENCES t908000_ParameterTypes(ParameterID), " // Same here
                      "ElevationDatum TEXT, "
                      "SurveyMethod TEXT, "
                      "Surveyor     TEXT, "
                      "SurveyDate   DATETIME, "
                      "LandTenure   TEXT, "
                      "Region       TEXT, "
                      "MiningLease  TEXT, "
                      "Comments     TEXT,"
                      "Source       TEXT NOT NULL, "
                      "SourceDate   DATETIME NOT NULL, "
                      "EntryAuthor  TEXT NOT NULL, "
                      "EntryDate    DATETIME NOT NULL)"
                      );

Форма безупречно отображает записи и отношения, включая поля со списком и делегаты табличного представления для полей отношений. Моя проблема в том, что любые изменения в значениях таблицы не передаются обратно в базу данных.

После долгих попыток я изменил setEditStrategy на OnManualSubmit. Я добавил вызов submitAll() в деструктор формы для обновления базы данных, но он возвращает false и выдает следующее сообщение об ошибке:

"около ".": синтаксическая ошибка. Невозможно выполнить оператор"

Я видел на какой-то странице, что это может быть связано с первичным ключом. Я сделал следующую команду в режиме отладки:

QString tempString = tableModelStations->primaryKey().name();

но строка оказалась пустой, что заставляет меня поверить, что проблема действительно была в первичном ключе.

Затем я создал подкласс QSqlRelationalTableModel, чтобы реализовать функцию setPrimaryKey() и сделать это вручную, но с этим тоже не повезло.

Может ли кто-нибудь пролить свет на:

  1. Почему submitAll() не работает

  2. Как получить доступ к оператору, используемому submitAll()


person user3094309    schedule 10.02.2014    source источник


Ответы (1)


  1. Почему submitAll() не работает, это t work only in your way, it seems not so good making submit in destructor; 2.How to access the statement used by submitAll() you don не нужно;

Тебе стоит попробовать:

  1. Не показывать первичный ключ в вашем представлении, не разрешать его изменять (это приведет к ошибке БД при дублировании первичных ключей);
  2. После изменения вида используйте SIGNAL dataChange(QModelIndex,QModelIndex) для обращения к вашему SLOT, где вы используете submitAll;
  3. При вставке строки в TableModel используйте: yourModel->insertRow(yourModel->rowCount(QModelIndex()))
  4. При вставке строки в RelationalTableModel используйте:

    QSqlRecord record; // prepare your record, not touching primary key, it's autoinc yourRelModel->insertRecord(yourRelModel->rowCount(QModelIndex()),record);

person AlexBee    schedule 30.07.2014
comment
Привет, Алекс, спасибо за это. Это был мой первый опыт работы с моделями SQL, и сейчас я переписал большую их часть, но большая проблема заключалась в том, что в то время в моих справочных таблицах не было первичных ключей. Как только я изменил это, это сработало как шарм! - person user3094309; 31.07.2014