【问题标题】:Embedded Database in QtQt 中的嵌入式数据库
【发布时间】:2011-05-14 08:18:03
【问题描述】:

我的 Qt 应用程序有一个 SQLite 数据库。我认为将数据库添加为资源是合乎逻辑的。

我无法让我的应用使用嵌入式资源进行编译。

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.

我尝试更改我的资源布局,因为它来自编译器不会进入数据库所在的 data/ 文件夹的消息。我在这个资源文件中遇到了完全相同的构建问题

<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

【问题讨论】:

  • 能否请您也发布您的 .pro 文件?这将有助于理解。谢谢。
  • 另外,你的 assets.qrc 文件在你的项目树中的什么位置?
  • 我添加了.pro文件,谢谢帮助
  • 发布 .pro 内容是否回答了您的第二个问题?在实际目录中 assets.qrc 位于项目文件夹的根目录中。 (即 .cpp、.h 和 .ui 文件与 .qrc 位于同一文件夹中)

标签: c++ qt sqlite embedded-resource


【解决方案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. 现在,当您重建应用程序时,它将位于 Contents/MacOS/data 文件夹中。因此,如果您的数据库被命名为 custom.db,您可以这样做:

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

【讨论】:

    【解决方案2】:

    您似乎删除或重命名了您的数据库文件 Shipping.db3 并添加了 ShippingData.db3。要解决此构建问题,您应该删除构建文件夹并重建项目。这应该可以解决您的构建问题。

    您可以在此处阅读数据库部署说明:http://discussion.forum.nokia.com/forum/showthread.php?202894-Add-existing-Sqlite-database-to-Qt-project

    【讨论】:

      【解决方案3】:

      即使你解决了编译问题,在 qrc 文件中嵌入 sqlite 数据库也不起作用。参见例如在Qt Centre ForumQt-interest mailing list 上进行讨论。最好的解决方案是恕我直言,在 qrc 文件中包含数据库的转储,创建内存 sqlite db 并从资源中的 SQL 语句重建数据库。

      【讨论】:

        猜你喜欢
        • 2011-03-07
        • 2014-01-11
        • 2023-03-19
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 2014-02-12
        • 1970-01-01
        • 2017-03-05
        相关资源
        最近更新 更多