How to Store and Retrieve Image on SQLite
Jump to navigation
Jump to search
Images (or any other binary data, from files or otherwise) can be stored in a database. One way to do it is converting the data into a QByteArray, and insert it into the database as a Binary Large OBject (BLOB).
Below is a full example of such a workflow, including reading the image back from the database and displaying it:
#include <QtSql>
#include <QtWidgets>
int main( int argc, char *argv[] )
{
QApplication app( argc, argv );
// Set up database
QString dbName( "myDatabase.db3" );
QFile::remove( dbName ); // delete sqlite file if it exists from a previous run
QSqlDatabase db = QSqlDatabase::addDatabase( "QSQLITE" );
db.setDatabaseName( dbName );
db.open();
QSqlQuery query = QSqlQuery( db );
query.exec( "CREATE TABLE IF NOT EXISTS imgTable ( filename TEXT, imagedata BLOB )" );
// Generate an image (in this case a screenshot) and store it in a QByteArray
QScreen *screen = app.primaryScreen();
QPixmap inPixmap = screen->grabWindow( 0 );
QByteArray inByteArray;
QBuffer inBuffer( &inByteArray );
inBuffer.open( QIODevice::WriteOnly );
inPixmap.save( &inBuffer, "PNG" ); // write inPixmap into inByteArray in PNG format
// Alternatively, load an image file directly into a QByteArray
// QFile file("screenshot.png");
// if (!file.open(QIODevice::ReadOnly)) return;
// QByteArray inByteArray = file.readAll();
// Insert image bytes into the database
// Note: make sure to wrap the :placeholder in parenthesis
query.prepare( "INSERT INTO imgTable (filename, imagedata) VALUES ('screenshot.png', :imageData)" );
query.bindValue( ":imageData", inByteArray );
if( !query.exec() )
qDebug() << "Error inserting image into table:\n" << query.lastError();
// Get image data back from database
if( !query.exec( "SELECT imagedata from imgTable" ))
qDebug() << "Error getting image from table:\n" << query.lastError();
query.first();
QByteArray outByteArray = query.value( 0 ).toByteArray();
QPixmap outPixmap = QPixmap();
outPixmap.loadFromData( outByteArray );
db.close();
// Display image
QLabel myLabel;
myLabel.setPixmap( outPixmap );
myLabel.show();
return app.exec();
}