2013-07-11 2 views
0

QNetworkAccessManager으로 다운로드 한 이미지 데이터를 QByteArray으로 삽입하려고합니다. 이 QByteArray을 BLOB로 삽입하려고합니다. 내 테이블 작성 쿼리는이 같은 삽입 쿼리,QByteArray가 부분적으로 sqlite3에 삽입되었습니다. (C++)

query = QString("INSERT INTO "); 
    query.append("TILE_IMAGE"); 
    query.append(QString("(TILE_ID, IMAGE_DATA ,INSERTED_AT ,USED_AT) VALUES(\'")); 
    query.append(*tileId); 
    query.append(QString("\',\'")); 
    query.append(QString(*imageData)); 
    query.append(QString("\',DATETIME('NOW'),DATETIME('NOW'))")); 

을 생성하지만보기가 표시 쿼리,

"INSERT INTO TILE_IMAGE(TILE_ID, IMAGE_DATA ,INSERTED_AT ,USED_AT) VALUES('ivbase_TILED_MAP_VIEW_16_37396_22531','ÿØÿà',DATETIME('NOW'),DATETIME('NOW'))" 

를 인쇄 할 때 BLOB 데이터는 4

CREATE TABLE TILE_IMAGE(TILE_ID VARCHAR(1050), IMAGE_DATA BLOB,INSERTED_AT DATETIME,USED_AT DATETIME, PRIMARY KEY(TILE_ID)) 

입니다 길이는 길다. 그리고 이상한 가치가 있습니다. *imageData의 스크린 샷은 enter image description here

이미지 256 * 256 * 4 길이입니다. 그 jpeg 이미지.

EDIT : CL의 코드를 따르고 IMAGE_DATA 열에는 일부 디아 몬 모양 문자가 있습니다. 아래 이미지가 있습니다. enter image description here

+0

어떤 유형이'imageData'입니까? –

답변

0

내가이 일을 다음과 같이 데이터베이스에서 읽을 때 여전히 다이아몬드 모양의 문자가 표시되어 있지만이

QString query = QString("INSERT INTO "); 
    query.append("TILE_IMAGE"); 
    query.append(QString("(TILE_ID, IMAGE_DATA ,INSERTED_AT ,USED_AT) VALUES(\'")); 
    query.append(*tileId); 
    query.append(QString("\',\'")); 
    query.append(QString(imageData->toBase64())); 
    query.append(QString("\',DATETIME('NOW'),DATETIME('NOW'))")); 
    load(query, QUERY_TYPE_CHANGE,false); 

입니다 수행하는 관리 방법

QString query; 
    query = QString("SELECT"); 
    query.append(" IMAGE_DATA FROM TILE_IMAGE WHERE TILE_ID=\'"); 
    query.append(tileId).append(QString("\'")); 
    int id = getId(); 
    load(query, id,true); 
    query = resultList.value(0).toMap().value("IMAGE_DATA").value<QString>(); 
    QByteArray arr = QByteArray::fromBase64(query.toLatin1()); 

다이아몬드 모양의 문자가 왜 표시되는지는 도움이됩니다.

0

blob의 이진 내용을 문자열로 변환 할 수 없습니다. 대신 parameters을 사용해야합니다

QSqlQuery query; 
query.prepare("INSERT INTO TILE_IMAGE(TILE_ID, IMAGE_DATA) VALUES(?,?)"); 
query.bindValue(0, *tileId); 
query.bindValue(1, *imageData); 
query.exec(); 
+0

안녕하세요. 나는 너 같은 코드를 바꿨다. 이제 다이아몬드 문자를 보여줍니다. 길이도 4 길이입니다. 그림으로 내 게시물을 편집했습니다. 답장을 보내 주셔서 감사합니다. – Tahlil