2015-02-24 24 views
5

Có cách nào để sử dụng cơ sở dữ liệu sqlite được điền sẵn với qwebview không? Tôi có một ứng dụng javascript sử dụng cơ sở dữ liệu đó.Cách sử dụng cơ sở dữ liệu sqlite được điền trước với qwebview?

Tôi đã kích hoạt lưu trữ offline,

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

thiết lập một kích thước confortable với nó

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

và thiết lập vị trí:

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

Sao chép các tập tin cơ sở dữ liệu từ tập tin nguồn QRC đến vị trí đó không thực hiện thủ thuật;

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

làm thế nào để tiến hành?

Cảm ơn bạn.

+0

Bạn có chắc mydatabase.db không tồn tại ở/data/myapp /? Vì QFile sẽ không ghi đè tệp nếu nó tồn tại ở đường dẫn đích và phải trả về false. Hãy thử in ra (QStandardPaths :: GenericDataLocation) + "/ data/myapp/mydatabase.db" và xem bạn có tăng gấp đôi/dữ liệu/myapp/trong đường dẫn hay không. – user3344236

+0

Xem câu trả lời được cập nhật cho một ví dụ sử dụng sql từ tệp cục bộ và sao chép src sang dest. – user3344236

Trả lời

2

Xác minh nếu file trong đường dẫn đích không tồn tại trước khi copy

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

câu trả lời Cập nhật: Tạo một dự án đơn giản

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 

nơi MAINQ.db là tập tin SQLite tôi. Và 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(); 
} 

Ở đó chúng tôi đã kết nối với db của chúng tôi và thực hiện một số truy vấn. Chúng tôi xác minh xem tệp có tồn tại hay không, nếu không, chúng tôi sẽ sao chép tệp đó vào một số vị trí. Kết quả từ sql chúng ta có thể gán cho các biến, sau đó sử dụng chúng như String trong WebView, v.v.

+0

Đó không phải là điều tôi muốn: Tôi muốn sử dụng cơ sở dữ liệu như một cơ sở dữ liệu HTML5 (Cơ sở dữ liệu SQL Web). Tôi tin rằng tôi phải sử dụng lớp 'QWebDatabase' và sao chép từ cơ sở dữ liệu mà tôi đã sao chép từ tệp tài nguyên vào cơ sở dữ liệu được sử dụng bởi webkit (tôi có thể truy cập vào nó như trong [here] (http://doc.qt.io/ qt-5/qwebdatabase.html # fileName)) .. Tôi muốn có một phương pháp trực tiếp. Bạn có thể nghĩ về một? –

+1

Như trong ví dụ này http://cadswes2.colorado.edu/~philw/2009/QtDocs/QtHybridWebNativeDevelopment_Whitepaper.pdf, chúng tôi sử dụng hàm openDatabase. Hãy xem http://qt-project.org/doc/qt-4.8/qtwebkit-guide-cache.html nơi bạn có thể sử dụng window.localStorage; để truy cập vào một db khách hàng được lưu trữ. Tôi không thể nghĩ ra phương pháp tiếp cận trực tiếp nào khác. – user3344236

Các vấn đề liên quan