Доброго времени суток.
Специально написал тестовую прогу чтобы найти причину.
https://disk.yandex.ru/d/CI2NohoT0Ps7Ww (https://disk.yandex.ru/d/CI2NohoT0Ps7Ww)
Вообщем в чем суть добавляю в базу данные используя
class Abonent_Model : public QSqlTableModel
bool Abonent_Model::add_model_abonent(const QString &nick_name, const QByteArray & hash, const QString & avatar)
{
//qDebug() << "m_model->tableName() = " << m_model->tableName();
// m_qdb.transaction();
QSqlRecord record = this->record();
// record.clear();
record.setValue("nick_name", nick_name);
record.setValue("hash_abonent", hash);
record.setValue("last_date_time", QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm"));
record.setValue("avatar", avatar);
if(this->insertRecord(-1, record)) //add to model
{
if (!this->submitAll()) //add to base_data
{
qDebug() << "Error database line: " << __LINE__ << this->database().lastError().text();
qDebug() << "Error model line: " << __LINE__ << this->lastError().text();
this->revertAll();
return false;
}
return true;
}
else //TODO db & rollback
{
qDebug() << "Error database line: " << __LINE__ << this->database().lastError().text();
qDebug() << "Error model line: " << __LINE__ << this->lastError().text();
this->database().rollback();
}
return false;
}
И submitAll выдает ошибку мол не чего добавлять в базу. (Error model line: 33 "No Fields to update")
Теперь заремим переопределенный метод и его реализацию
protected:
Qt::ItemFlags flags(const QModelIndex &index) const;
//Qt::ItemFlags Abonent_Model::flags(const QModelIndex &index) const
//{
// if(!index.isValid())
// return Qt::ItemIsEnabled;
// return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
//}
и теперь все прекрасно добавляется, это походу баг QSqlTableModel, так как эти flags связаны с представлением , а не с базой. Может кто сталкивался гляньте ?
Конечно можно добавить через
QSqlQuery query(m_qdb);
ok = query.exec("insert into abonents values('nick1', '111111111', '2.02.2024 02:01', '')");
if(!ok)
{
qDebug() << __LINE__ << "query.exec" << query.lastError().text();
}
Но это так не устраивает , тогда лучше использовать libsqlite и свою модель от QAbstractItemModel , а не это вот все