sql — QByteArray как данные BLOB, частично вставленные в sqlite3 (c ++)

Я пытаюсь вставить данные изображения, которые я скачал с QNetworkAccessManager как QByteArray, Я пытаюсь вставить это QByteArray как BLOB. Мой запрос на создание таблицы

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

Я создал запрос на вставку, как это,

    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. И имеет некоторые странные значения. Снимок экрана того, что *imageData содержит,
введите описание изображения здесь

Длина изображения 256 * 256 * 4. Это изображение в формате JPEG.

РЕДАКТИРОВАТЬ: я следовал коду CL, и теперь столбец IMAGE_DATA имеет несколько символов в форме диамона. Изображение ниже.
введите описание изображения здесь

0

Решение

Вы не можете преобразовать двоичное содержимое BLOB-объекта в строку.
Вы должны использовать параметры вместо:

QSqlQuery query;
query.prepare("INSERT INTO TILE_IMAGE(TILE_ID, IMAGE_DATA) VALUES(?,?)");
query.bindValue(0, *tileId);
query.bindValue(1, *imageData);
query.exec();
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

По вопросам рекламы [email protected]