QSqlRelationalTableModel - вставить запись больше 256

У меня есть таблица node={id,name} и таблица segment={id,nodeFrom,nodeTo} в базе данных SQLite, где node.id и сегмент. id - поля AUTOINCREMENT.

Я создаю QSqlTableModel для Node следующим образом:

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();  // (*)
}

Я могу успешно добавить 280 узлов, используя addNode(). Я также могу успешно добавить сегменты, если nodeFrom‹=256 и nodeTo‹=256. Для любого сегмента, ссылающегося на узел, больший или равный 256, я получаю

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

в одной из строк, отмеченных знаком (*) функции addSegment.

Я погуглил и обнаружил, что у людей возникают другие (очевидно, не связанные) проблемы, когда они достигают волшебного количества 256 записей. Кажется, что никакое решение не работает с этой конкретной проблемой.

Что я делаю неправильно?

Спасибо!


person mvc    schedule 20.06.2014    source источник


Ответы (2)


Причина этой ошибки кроется в методе 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();
person Paweł Krakowiak    schedule 30.07.2015

Попробуйте этот способ исправить

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

newRec.setValue(2,QVariant(nodeTo));
person AlexBee    schedule 30.07.2014