How to Store and Retrieve Image on SQLite: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
Waldyrious (talk | contribs) (expand code snippets into a full working example) |
||
(6 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
{{LangSwitch}} | |||
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 [[wikipedia:Binary large object|Binary Large OBject]] (BLOB). | |||
Below is a full example of such a workflow, including reading the image back from the database and displaying it: | |||
<source lang="cpp"> | |||
#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(); | |||
} | |||
</source> | |||
[[Category:Snippets]] | |||
[[Category:HowTo]] |
Latest revision as of 14:00, 24 November 2015
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();
}