Difference between revisions of "How to Store and Retrieve Image on SQLite"
From Qt Wiki
AutoSpider (talk | contribs) (Add "cleanup" tag) |
Waldyrious (talk | contribs) (expand code snippets into a full working example) |
||
(2 intermediate revisions by 2 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();
}