我在SQLite数据库中有一个表node = {id,name}和一个表segment = {id,nodeFrom,nodeTo},其中node.id和segment.id是AUTOINCREMENT字段。
我正在为Node创建一个QSqlTableModel,如下所示:
nodeModel = new QSqlTableModel(this,db);
nodeModel->setTable("Node");
nodeModel->setEditStrategy(QSqlTableModel::OnFieldChange);
并且我使用以下代码插入节点:
int addNode(QString name) {
QSqlRecord newRec = nodeModel->record();
newRec.setGenerated("id",false);
newRec.setValue("name",name);
if (not nodeModel->insertRecord(-1,newRec))
qDebug() << nodeModel->lastError();
if (not nodeModel->submit())
qDebug() << nodeModel->lastError();
return nodeModel->query().lastInsertId().toInt();
}
这似乎有效。现在,为段定义一个QSqlRelationalTableModel,如下所示:
segModel = new QSqlRelationalTableModel(this,db);
segModel->setTable("Segment");
segModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
segModel->setRelation(segModel->fieldIndex("nodeFrom"),
QSqlRelation("Node","id","name"));
segModel->setRelation(segModel->fieldIndex("nodeTo"),
QSqlRelation("Node","id","name"));
然后我有以下代码用于插入段:
int addSegment(int nodeFrom, int nodeTo) {
QSqlRecord newRec = segModel->record();
newRec.setGenerated("id",false);
newRec.setValue(1,nodeFrom);
newRec.setValue(2,nodeTo);
if (not segModel->insertRecord(-1,newRec)) // (*)
qDebug() << segModel->lastError();
if (not segModel->submitAll())
qDebug() << segModel->lastError(); // (*)
}
我可以使用addNode()成功添加280个节点。如果nodeFrom
QSqlError("19", "Unable to fetch row", "Segment.nodeTo may not be NULL")
在标有addSegment函数(*)的行之一中。
我在Google上搜索后发现,当人们达到不可思议的256条记录数时,他们还有其他(显然无关)的问题。似乎没有解决方案可以解决此特定问题。
我究竟做错了什么?
谢谢!
最佳答案
该错误的原因在于使用这种循环void QRelation::populateDictionary()
的for (int i=0; i < model->rowCount(); ++i)
方法。如果您使用的数据库没有报告查询的大小(例如SQLite),则rowCount()
方法将返回此神奇的256
值。
您可以通过在使用data(...)
或setData(...)
之前填充关系模型来解决此问题。首先,您可以尝试:
setRelation(nodeFromCol, QSqlRelation("Node", "id", "name"));
QSqlTableModel *model = relationModel(nodeFromCol);
while(model->canFetchMore())
model->fetchMore();