2014-06-20 7 views
2

이상의 레코드가 더 삽입 한 테이블 세그먼트 = {ID, nodeFrom, nodeTo}는 SQLite는 DB 여기서 node.id 세그먼트이다. id는 AUTOINCREMENT 필드입니다. 다음과 같이QSqlRelationalTableModel - I 테이블을 <strong>노드</strong> = {ID, 이름}이 256

나는, 노드에 대한 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(); 
} 

이 작동하는 것 같다. 이제 다음과 같이, 세그먼트에 대한 I는 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)보다 크거나 동일한 참조하는 모든 세그먼트에 대한 I는 라인들 중 하나에

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

는 (*)의 addSegment 함수로 표시 얻는다.

저는 인터넷 검색을 통해 사람들이 마법적인 256 레코드 수를 기록했을 때 다른 (분명히 관련이없는) 문제를 겪고 있음을 알았습니다. 이 특정 문제에 대한 해결책은 없습니다.

내가 뭘 잘못하고 있니?

감사합니다.

답변

0

이 오류의 원인은 루프 for (int i=0; i < model->rowCount(); ++i)를 사용하는 방법에있다 void QRelation::populateDictionary()

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

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

를 해결하기 위해이 방법을보십시오. 쿼리의 크기를보고하지 않는 데이터베이스 (예 : SQLite)를 사용하는 경우 rowCount() 메서드는이 마법적인 256 값을 반환합니다.

data(...) 또는 setData(...)을 사용하기 전에 관계 모델을 채워서 해결할 수 있습니다. 처음에는 다음과 같이 시도 할 수 있습니다.

setRelation(nodeFromCol, QSqlRelation("Node", "id", "name")); 
QSqlTableModel *model = relationModel(nodeFromCol); 
while(model->canFetchMore()) 
    model->fetchMore();