2015-02-24 23 views
5

Czy istnieje sposób użycia wstępnie wypełnionej bazy danych sqlite z qwebview? Mam aplikację javascript, która korzysta z tej bazy danych.Jak używać wstępnie wypełnionej bazy danych sqlite za pomocą qwebview?

mam włączony zalogowany przechowywania,

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

ustawić komfortowy rozmiar niej

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

i ustawić położenie:

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

Kopiowanie pliku bazy danych z pliku zasobów QRC do tej lokalizacji nie wystarczy;

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

jak postępować?

Dziękuję.

+0

Czy jesteś pewien, że mydatabase.db jeszcze nie istnieje w/data/myapp /? Ponieważ QFile nie zastąpi pliku, jeśli istnieje w ścieżce docelowej, i powinien zwrócić wartość false. Spróbuj wydrukować (QStandardPaths :: GenericDataLocation) + "/ data/myapp/mydatabase.db" i sprawdź, czy otrzymasz podwojenie/data/myapp/w ścieżce. – user3344236

+0

Zobacz zaktualizowaną odpowiedź dla przykładu używając sql z lokalnego pliku i skopiuj src do dest. – user3344236

Odpowiedz

2

Sprawdź, czy plik w ścieżce docelowej nie istnieje przed kopią

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

Aktualizacja odpowiedź: Utworzono prosty projekt

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 

gdzie MAINQ.db jest mój plik SQLite. I 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(); 
} 

dyspozycji mamy podłączony do naszego db i wykonać jakieś zapytania. Sprawdzamy, czy plik istnieje, jeśli nie, skopiujemy go do pewnej lokalizacji. Wynik sql możemy przypisać do zmiennych, następnie użyć ich jako String w WebView itp.

+0

Niezupełnie tego chciałem: chciałem użyć bazy danych jako bazy danych HTML5 (baza danych Web SQL). Uważam, że muszę użyć klasy 'QWebDatabase' i skopiować z bazy danych skopiowanej z pliku zasobów do bazy danych używanej przez webkit (mogę mieć do niej dostęp tak jak w [tutaj] (http://doc.qt.io/ qt-5/qwebdatabase.html # nazwa_pliku)). Chciałem metodę bezpośrednią. Czy możesz o tym pomyśleć? –

+1

Podobnie jak w tym przykładzie http://cadswes2.colorado.edu/~philw/2009/QtDocs/QtHybridWebNativeDevelopment_Whitepaper.pdf używamy openDatabase. Zobacz także http://qt-project.org/doc/qt-4.8/qtwebkit-guide-cache.html gdzie możesz użyć window.localStorage; uzyskać dostęp do przechowywanej bazy danych klienta. Nie mogę myśleć o czymś bardziej bezpośrednim metodą dostępu. – user3344236