2010-07-27 1 views
1

QSqlTableModel을 사용하여 SQLite 데이터베이스에 데이터를 삽입하는 데 문제가 있습니다. 테이블은 다음과 같이 작성됩니다첫 번째 오류 후 QSqlTableRecord를 사용하여 레코드를 계속 삽입 할 수 없습니다.

QSqlQuery createTblSMS("CREATE TABLE sms_tbl(" 
     "isRead BOOLEAN NOT NULL," 
     "readTime DATETIME," 
     "arrivalTime DATETIME NOT NULL," 
     "sender TEXT NOT NULL," 
     "receiver TEXT NOT NULL," 
     "smsContent TEXT," 
     "PRIMARY KEY(arrivalTime, sender, receiver));"); 

가이 같은 기록을 삽입하고 있습니다 :

smsModel->insertRecord(-1, sms); 
QString error = smsModel->lastError().text(); 
smsModel->submitAll(); 

smsModel는 QSqlTableModel입니다.

예를 들어이 값 (false, NULL, '2010-06-30 17:27:55', '075710383', 'ONE 142140', 'TOP 15 # 2')과 함께 레코드를 넣으면 - 레코드가 삽입됩니다. 해당 레코드 다음에이 값 (false, NULL, '2010-06-30 10:05:29', '075710383', 'ONE 142140', 'TOP 15 # 3')과 함께 레코드를 넣으면이 레코드가 삽입됩니다.

하지만 이미 삽입 된 레코드 (false, NULL, '2010-06-30 17:27:55', '075710383', 'ONE 142140', 'TOP 15 # 2')를 다시 삽입하려고하면 데이터베이스, smsModel이 같은 오류를 줄 것이다 : "열 arrivalTime, 발신자, 수신기가 고유하지 않습니다 행을 가져올 수 없습니다"- 예상된다. 다른 고유 한 레코드를 나중에 삽입하면 모델에 오류가 발생합니다. 이 일이 왜 일어 났는지 전혀 모르십니까?

답변

1

이 두 가지 문제가있었습니다.

수동 제출 모드에서 QSqlTableModel은 submitAll이 실패 할 때 캐시를 지우지 않습니다 (제약 조건을 위반하는 레코드를 보낼 때).

이 문제를 해결하려면 보류중인 변경 사항을 제거하려면 select() 또는 revertAll 호출을 호출해야합니다.

사이먼이이 아주 분명하지 않지만,이, 그것을 확인 :

0

기본 키과 같은 레코드를 다시 추가 할 수 없습니다. arrivalTime, sender, receiver이 포함 된 기본 키이 있습니다. 따라서이 세 가지 값의 값이 같은 값을 사용할 수 없습니다.

int 유형의 auto incrementsms_table_id을 변경할 수 있습니다.

+0

http://doc.qt.io/qt-4.8/qsqltablemodel.html#submitAll 예 내가 그 기본 키 기록이 존재하는 경우 I는 기본 키와 레코드를 추가 할 수 없음을 알고있다. 문제는 다음과 같습니다. 데이터베이스에 이미있는 레코드를 추가하려고하면 고유 기본 키가있는 레코드를 추가 할 수 없습니다. – user261882

0

QSqlTableModel을 사용하여 솔루션을 찾지 못해서 QSqlQuery로 해결 방법을 만들었습니다. 코드는 다음과 같습니다.

QSqlQuery query(QSqlDatabase::database(mConnectionName)); 
    query.prepare("INSERT INTO sms_tbl (isRead, readTime, arrivalTime," 
     "sender, receiver, smsContent) " 
     "VALUES (:isRead, :readTime, :arrivalTime, " 
     ":sender, :receiver, :smsContent)"); 
    query.bindValue(":isRead", sms.value("isRead").toBool()); 
    query.bindValue(":readTime", sms.value("readTime").toString()); 
    query.bindValue(":arrivalTime", sms.value("arrivalTime").toString()); 
    query.bindValue(":sender", sms.value("sender").toString()); 
    query.bindValue(":receiver", sms.value("receiver").toString()); 
    query.bindValue(":smsContent", sms.value("smsContent").toString()); 
    query.exec(); 
관련 문제