首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSqlRelationalTableModel -插入大于256个的记录

QSqlRelationalTableModel -插入大于256个的记录
EN

Stack Overflow用户
提问于 2014-06-20 00:47:06
回答 2查看 940关注 0票数 3

我有一个表节点={id,name},以及SQLite db中的表={id,nodeFrom,nodeTo},其中node.id和segment.id是AUTOINCREMENT字段。

我正在为Node创建一个QSqlTableModel,如下所示:

代码语言:javascript
复制
nodeModel = new QSqlTableModel(this,db);
nodeModel->setTable("Node");
nodeModel->setEditStrategy(QSqlTableModel::OnFieldChange);

我使用以下代码插入节点:

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
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"));

然后,我有以下插入段的代码:

代码语言:javascript
复制
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节点的任何段,我将得到一个

代码语言:javascript
复制
QSqlError("19", "Unable to fetch row", "Segment.nodeTo may not be NULL")

在用addSegment函数的(*)标记的一行中。

我在谷歌上搜索了一下,发现当人们达到256的记录时,他们还出现了其他(显然是无关的)问题。似乎没有任何解决办法能解决这一特殊问题。

我做错了什么?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2015-07-30 21:04:58

造成此错误的原因在于void QRelation::populateDictionary()方法,该方法使用这样的循环for (int i=0; i < model->rowCount(); ++i)。如果您使用的数据库不报告查询的大小(例如,SQLite),rowCount()方法将返回这个神奇的256值。

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

代码语言:javascript
复制
setRelation(nodeFromCol, QSqlRelation("Node", "id", "name"));
QSqlTableModel *model = relationModel(nodeFromCol);
while(model->canFetchMore())
    model->fetchMore();
票数 1
EN

Stack Overflow用户

发布于 2014-07-30 03:57:01

试着用这种方法来修复

代码语言:javascript
复制
newRec.setValue(1,QVariant(nodeFrom));

newRec.setValue(2,QVariant(nodeTo));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24318400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档