我在 SQLite 数据库中有一个表节点={id,name} 和一个表段={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<=256 和 nodeTo<=256,我也可以成功添加段。对于引用大于或等于 256 的节点的任何段,我得到一个
QSqlError("19", "Unable to fetch row", "Segment.nodeTo may not be NULL")
在 addSegment 函数的标有 (*) 的行之一中。
我搜索了一下,发现人们在达到神奇的 256 条记录时遇到了其他(显然不相关的)问题。似乎没有解决方案可以解决这个特定问题。
我究竟做错了什么?
谢谢!