QSqlRelationalTableModel - 插入大于256的记录

时间:2014-06-20 00:47:06

标签: qt sqlite qsqlquery qsqltablemodel qsqldatabase

我在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&lt; = 256且nodeTo&lt; = 256,我也可以成功添加段。对于引用大于或等于256的节点的任何段,我得到

QSqlError("19", "Unable to fetch row", "Segment.nodeTo may not be NULL")

在其中一行标有addSegment函数的(*)。

我用谷歌搜索并发现人们在达到神奇的256记录数时会遇到其他(显然无关的)问题。似乎没有解决方案可以解决这个特殊问题。

我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

尝试这种方法来修复

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

newRec.setValue(2,QVariant(nodeTo));

答案 1 :(得分:0)

此错误的原因在于使用此类循环void QRelation::populateDictionary()的{​​{1}}方法。如果您使用的数据库不会报告查询的大小(例如SQLite),则for (int i=0; i < model->rowCount(); ++i)方法将返回此神奇的rowCount()值。

您可以在使用256data(...)之前填充关系模型来解决此问题。首先,您可以尝试:

setData(...)