Seite 1 von 1

[gelöst] Sqlite DB in Resourcen Datei wird nicht geöffnet.

Verfasst: 14. März 2011 23:56
von brr
Hallo,

ich will eine Sqlite Datenbank in meinem Programm verwenden. Diese will ich mittels des Qt Resource Systems einbinden. Beim öffnen erhalte ich allerdings die Meldung: "unable to open database file Error opening database"



Hier ein Minimalbeispiel:

resource_minExample.pro

Code: Alles auswählen

# -------------------------------------------------
# Project created by QtCreator 2011-03-14T23:07:50
# -------------------------------------------------
QT += sql
QT -= gui
TARGET = resource_minExample
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
RESOURCES += res.qrc
main.cpp

Code: Alles auswählen

#include <QtCore/QCoreApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QFile>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":/db.sqlite");
    QFile dbFile(":/db.sqlite");
    if (!dbFile.exists())
        qDebug() << "Datei nicht gefunden";
    else
    {
        db.setDatabaseName(":/db.sqlite");
        qDebug() << "Datei wurde gefunden";
    }
    if(!db.open())
        qDebug() << db.lastError().text();
    else qDebug() << "Datenbank konnte geöffnet werden";

    db.setDatabaseName("./db.sqlite");
    if(!db.open())
        qDebug() << db.lastError().text();
    else qDebug() << "Datenbank konnte geöffnet werden";

    return a.exec();
}
Ich kriege den Output:
Starte resource_minExample...
Datei wurde gefunden
"unable to open database file Error opening database"
Datenbank konnte geöffnet werden
res.qrc

Code: Alles auswählen

<!DOCTYPE RCC><RCC version="1.0">
    <qresource>
        <file>db.sqlite</file>
    </qresource>
</RCC>
Mit Verwendung eines alias genau das gleiche:

Code: Alles auswählen

<!DOCTYPE RCC><RCC version="1.0">
    <qresource>
        <file alias = "dbalias.sqlite">db.sqlite</file>
    </qresource>
</RCC>

Code: Alles auswählen

[...]
db.setDatabaseName(":/dbalias.sqlite");
[...]
Gleicher Output in dieser Variante.

Inhalt des Verzeichnisses:

Code: Alles auswählen

-rw-r--r-- 1 x x   8192 2011-03-14 22:29 db.sqlite
-rw-r--r-- 1 x x    519 2011-03-14 23:25 main.cpp
-rw-r--r-- 1 x x    299 2011-03-14 23:09 resource_minExample.pro
-rw-r--r-- 1 x x    105 2011-03-14 23:30 res.qrc
Warum funktioniert das so nicht?
Danke im Voraus.

Verfasst: 15. März 2011 06:30
von Christian81
Das geht nicht. Zumal die Resourcen read-only sind.

Verfasst: 15. März 2011 16:03
von brr
Dann ist mein Problem wohl gelöst (:

Verfasst: 16. März 2011 11:10
von RHBaum
Wobei mittel und wege gibt es immer.

Ne Ressource iss nen einkompilierter datenstrom.
Du bekommst ihn auch nur als Datenstrom.

Was du nun brauchst, ist ein Tool welches dir eine datenbank in einen Datenstrom/Liste aus Anweisungen "wegdumpt" und ein Befehl, welches so einen Dump als Stream wieder in eine DB einliest auf API-Ebene.
Denk was brauchbares dafuer hat sqlite.

Dann nimmst ne datenbank, dumpst die weg.
den dump fuegst als ressource deinem Prog hinzu.
in deinem programm erzeugst nen neues SQlite Object, erzeugst nen readonly Stream deiner Gedumpten Daten, fuetterst das SQLite Object mit dem Stream.
Voiala hasst du ne DB mit aus dem Datensegment deines Progs befuellten Werten !

Was aber definitiv nicht geht, ist dass die DB bearbeiten laesst und die aenderungen im Datensegment deines Progs abspeichern lassen willst ! ne exe die sich selber modifiziert ! Da hat das BS glaub ich was dagegen !

Ciao ...