2010-11-23 43 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"));