如何在qwebview中使用预先填充的sqlite数据库?

时间:2015-02-24 12:26:12

标签: qt sqlite qwebview

有没有办法在qwebview中使用预先填充的sqlite数据库?我有一个使用该数据库的javascript应用程序。

我已启用离线存储空间

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

为它设置一个舒适的大小

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

并设置位置:

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

将数据库文件从qrc资源文件复制到该位置并不起作用;

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

怎么办?

谢谢。

1 个答案:

答案 0 :(得分:2)

验证复制前目标路径中的文件是否不存在

     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)
   }

更新的答案: 创建了一个简单的项目

   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

其中MAINQ.db是我的sqlite文件。 和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();
 }

我们已连接到我们的数据库并执行一些查询。我们验证文件是否存在,如果不存在,我们将其复制到某个位置。我们可以将sql的结果赋给变量,然后在WebView等中将它们用作String。