【问题标题】:How to use a pre-populated sqlite database with qwebview?如何将预填充的 sqlite 数据库与 qwebview 一起使用?
【发布时间】:2015-04-26 01:47:25
【问题描述】:

有没有办法将预填充的 sqlite 数据库与 qwebview 一起使用?我有一个使用该数据库的 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");

如何进行?

谢谢。

【问题讨论】:

  • 您确定 /data/myapp/ 中不存在 mydatabase.db 吗?因为如果文件存在于目标路径,QFile 不会覆盖文件,并且应该返回 false。尝试打印出 (QStandardPaths::GenericDataLocation)+"/data/myapp/mydatabase.db" 看看你是否在路径中得到双倍的 /data/myapp/。
  • 查看更新的答案以获取使用本地文件中的 sql 并将 src 复制到 dest 的示例。

标签: qt sqlite qwebview


【解决方案1】:

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

     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 等中的字符串。

【讨论】:

  • 这不是我想要的:我想将数据库用作 HTML5 数据库(Web SQL 数据库)。我相信我必须使用QWebDatabase 类并从我从资源文件复制到 webkit 使用的数据库的数据库中复制(我可以像在here 中一样访问它)。我想要一个直接的方法。你能想到一个吗?
  • 在这个例子中cadswes2.colorado.edu/~philw/2009/QtDocs/… 我们可以使用openDatabase。还可以查看qt-project.org/doc/qt-4.8/qtwebkit-guide-cache.html,您可以在其中使用 window.localStorage;访问存储的客户端数据库。我想不出更直接的访问方法。
猜你喜欢
  • 2017-10-31
  • 2013-03-11
  • 2017-03-28
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
相关资源
最近更新 更多