2015-02-24 3 views
5

Есть ли способ использовать предварительно заполненную базу данных sqlite с qwebview? У меня есть приложение javascript, которое использует эту базу данных.Как использовать предварительно заполненную базу данных sqlite с qwebview?

Я включил форума хранения,

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/in путь. – user3344236

+0

См. Обновленный ответ для примера, используя sql из локального файла и скопируйте src в dest. – user3344236

ответ

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 мы можем назначить переменным, а затем использовать их как String в WebView и т. Д.

+0

Это не совсем то, что я хотел: я хотел использовать базу данных как базу данных HTML5 (база данных Web SQL). Я считаю, что я должен использовать класс 'QWebDatabase' и копировать из этой базы данных, которую я скопировал из файла ресурсов в базу данных, используемую webkit (у меня есть доступ к ней, как в [здесь] (http://doc.qt.io/ qt-5/qwebdatabase.html # fileName)) .. Мне нужен прямой метод. Можете ли вы подумать об одном? –

+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; для доступа к хранимому db клиента. Я не могу придумать что-то более прямое. – user3344236

Смежные вопросы