2015-02-24 100 views
5

有沒有辦法使用qwebview預填充SQLite數據庫?我有一個使用該數據庫的JavaScript應用程序。如何在qwebview中使用預填充的sqlite數據庫?

我已經啓用離線存儲,

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"); 

如何進行?

謝謝。

+0

您確定mydatabase.db尚不存在於/ data/myapp /?因爲如果QFile存在於目標路徑中,它不會覆蓋文件,並且應該返回false。嘗試打印出(QStandardPaths :: GenericDataLocation)+「/ data/myapp/mydatabase.db」並查看您是否在路徑中加倍/ data/myapp /。 – user3344236 2015-03-05 12:49:20

+0

查看從本地文件使用sql並將src複製到dest的示例的更新答案。 – user3344236 2015-03-06 10:44:40

回答

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是我的源碼文件。 而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等中使用它們作爲字符串。

+0

這不是我想要的:我想將數據庫用作HTML5數據庫(Web SQL數據庫)。我相信我必須使用'QWebDatabase'類,並從我從資源文件複製到webkit使用的數據庫的數據庫中進行復制(我可以像訪問[這裏]一樣訪問它(http://doc.qt.io/) qt-5/qwebdatabase.html#fileName))..我想要一個直接的方法。你能想到一個嗎? – 2015-03-09 07:10:15

+1

正如在這個例子中http://cadswes2.colorado.edu/~philw/2009/QtDocs/QtHybridWebNativeDevelopment_Whitepaper.pdf我們使用openDatabase。看看http://qt-project.org/doc/qt-4.8/qtwebkit-guide-cache.html你可以使用window.localStorage;訪問存儲的客戶端數據庫。我想不出更直接的訪問方法。 – user3344236 2015-03-09 09:40:01

相關問題