SQLite データベースにテーブルノード={id,name} とテーブルセグメント={id,nodeFrom,nodeTo} があり、node.id と segment.id は AUTOINCREMENT フィールドです。
次のように、ノード用の 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 関数の (*) でマークされた行の 1 つ。
私がググったところ、魔法の 256 レコード数に達したときに、人々が他の (明らかに無関係な) 問題を抱えていることがわかりました。この特定の問題では解決策がないようです。
私は何を間違っていますか?
ありがとう!