2010-11-23 44 views
5

我有一個適用於我的Qt應用程序的SQLite數據庫。我認爲將數據庫添加爲資源是合乎邏輯的。Qt中的嵌入式數據庫

我不能讓我的應用程序與嵌入式資源進行編譯。

connection.h

#ifndef CONNECTION_H 
#define CONNECTION_H 

#include <QMessageBox> 
#include <QSqlDatabase> 
#include <QSqlError> 
#include <QSqlQuery> 

static bool createConnection() 
{ 
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 
    db.setDatabaseName(":/data/ShippingData.db3"); 
    if (!db.open()) 
    { 
     QMessageBox::critical(0, QObject::tr("Database Error"), db.lastError().text()); 
     return false; 
    } 
    return true; 
} 

#endif // CONNECTION_H 

assets.qrc

<RCC> 
    <qresource prefix="/data"> 
     <file>ShippingData.db3</file> 
    </qresource> 
</RCC> 

我的SQLite數據庫現在的問題是這樣的

app.pro 
    file.h 
    file.cpp 
    data/ShippingData.db3 

構建的問題(從Qt Creator中)

No rule to make target `../TimePlotter/Shipping.db3', needed by `debug/qrc_assets.cpp'. Stop. 

我試着改變我的資源佈局,因爲它從編譯器沒有進入數據庫所在的數據/文件夾的消息中。我得到這個資源文件

<RCC> 
    <qresource> 
     <file>data/ShippingData.db3</file> 
    </qresource> 
</RCC> 

TimePlotter.pro

#------------------------------------------------- 
# 
# Project created by QtCreator 2010-11-21T03:18:17 
# 
#------------------------------------------------- 

QT  += core gui 

TARGET = TimePlotter 
TEMPLATE = app 


SOURCES += main.cpp\ 
     mainwindow.cpp \ 
    time.cpp \ 
    clients.cpp \ 
    printTime.cpp 

HEADERS += mainwindow.h \ 
    time.h \ 
    clients.h \ 
    printTime.h \ 
    connection.h 

FORMS += mainwindow.ui \ 
    time.ui \ 
    clients.ui \ 
    printTime.ui 

RESOURCES += \ 
    assets.qrc 
+0

能否請您發表您的.pro文件也?這將有助於理解。謝謝。 – 2010-11-23 15:16:25

回答

8

即使您解決編譯問題,嵌入在QRC文件SQLite數據庫將無法工作完全相同的構建問題。見例如在Qt Centre ForumQt-interest mailing list的討論。最好的解決方案是恕我直言,在qrc文件中包含數據庫轉儲,創建內存sqlite數據庫並從資源中的SQL語句重建數據庫。

1

我至少知道如何做到這一點在Mac OSX,其中QMAKE_BUNDLE_DATA參數工作。對於Windows,請查看this answer

  1. 在您的項目目錄中創建一個名爲「data」的目錄。
  2. 把你的數據庫文件放在那裏。
  3. 在你的.pro文件,添加此部分:

    mac { Resources.files = data Resources.path = Contents/MacOS QMAKE_BUNDLE_DATA += Resources }

  4. 現在,當您重新構建應用程序,它將被定位在內容/ MacOS的/ data文件夾。因此,你可以做這樣的事情,如果你的數據庫被命名爲custom.db:

    db.setDatabaseName(QCoreApplication::applicationDirPath().append("/data/custom.db"));