How to use a pre-populated sqlite database with qwebview?

Is there a way to use a pre-populated sqlite database with qwebview? I have a javascript application that uses this database.

I turned on offline storage,

QWebSettings::globalSettings()->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, true); 

set a convenient size for it

 QWebSettings::setOfflineStorageDefaultQuota(20*1024*1024); 

and set the location:

 QWebSettings::globalSettings()->setOfflineStoragePath(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)+"/data/myapp"); 

Copying the database file from the qrc resource file to this location does not do the trick;

 QFile::copy(":/mydatabase.db" , QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)+"/data/myapp/mydatabase.db"); 

how to act?

Thanks.

+5
source share
1 answer

Check if the file path exists in the path before copying

  const QString filedest = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/data/app/") + "mydatabase.db"; if (!QFile::exists(filedest)) { // you can use QVERIFY(QFile::copy(src, filedest)); QFile::copy(src, filedest) } 

Updated answer: Created a simple project

  QT += core gui QT += sql QT += webkitwidgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = aawa TEMPLATE = app SOURCES += main.cpp DISTFILES += \ ../Desktop/before/MAINQ.db 

where MAINQ.db is my sqlite file. And main.cpp

  #include <QApplication> #include <qgraphicsscene.h> #include <QGraphicsView> #include <QVBoxLayout> #include <QPushButton> #include <QStandardPaths> #include <QFile> #include <QtSql> #include <QFileInfo> int main(int argc, char* argv[]){ QApplication app(argc, argv); QGraphicsScene* scene = new QGraphicsScene; QGraphicsView* view = new QGraphicsView(scene); //scene->setBackgroundBrush((Qt::white); QWidget *widget = new QWidget; view->setBackgroundBrush(Qt::yellow); QVBoxLayout* vlayout = new QVBoxLayout(widget); vlayout->addWidget(view); vlayout->addWidget(new QPushButton("print")); printf("ok.."); QSqlDatabase db; db = QSqlDatabase::addDatabase("QSQLITE"); //now full path of my db db.setDatabaseName("/Users/Ioan/Desktop/before/MAINQ.db"); if (db.open()) { qDebug() << "tabele in db " << db.tables(); QSqlQuery query(db); query.prepare( "SELECT id FROM user_cards"); if( !query.exec() ) qDebug() << query.lastError(); else { qDebug( "Selected!" ); QSqlRecord rec = query.record(); int cols = rec.count(); for( int c=0; c<cols; c++ ) qDebug() << QString( "Column %1: %2" ).arg( c ).arg( rec.fieldName(c) ); for( int r=0; query.next(); r++ ) for( int c=0; c<cols; c++ ) qDebug() << QString( "Row %1, %2: %3" ).arg( r ).arg( rec.fieldName(c) ).arg( query.value(c).toString() ); } qDebug() << "nice."; } else { qDebug() << "DB not open."; } const QString src = "/Users/Ioan/Desktop/before/MAINQ.db"; db.close(); // for close connection const QString filedest = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/data/app/") + "mydatabase.db"; QFile file( filedest ); if( !file.exists() ) { qDebug() << "The file" << file.fileName() << "does not exist."; // return 0; } else { QFile::copy(file, filedest); } widget->show(); return app.exec(); } 

There we connected to our db and performed some request. We check if the file exists if we do not copy it to any place. We can assign the result from sql to variables, and then use them as String in WebView, etc.

+2
source

Source: https://habr.com/ru/post/1214073/


All Articles