3

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 レコード数に達したときに、人々が他の (明らかに無関係な) 問題を抱えていることがわかりました。この特定の問題では解決策がないようです。

私は何を間違っていますか?

ありがとう!

4

2 に答える 2

1

このエラーの原因は、この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();
于 2015-07-30T21:04:58.587 に答える
0

この方法で修正してみてください

newRec.setValue(1,QVariant(nodeFrom));

newRec.setValue(2,QVariant(nodeTo));
于 2014-07-30T03:57:01.850 に答える