[SOLVED]SQLite Zugriffsproblem

Alles rund um die Programmierung mit Qt
Antworten
HappyEnding
Beiträge: 26
Registriert: 5. März 2009 14:15

[SOLVED]SQLite Zugriffsproblem

Beitrag von HappyEnding »

Hi, ich bin gerade dabei einen BirthdayReminder zu schreiben und wollte dazu die Daten in einer SQLite Datenbank erstellen. Allerdings gibt es dabei ein Problem. Folgender Code erstellt mir zwar eine Datenbank mit dem namen Birthday.db aber es gelingt mir einfach nicht, daten davon auszulesen.

Code: Alles auswählen

#include <QFile>
#include <QDebug>
#include <QVariant>
#include "dbhandler.h"

DbHandler::DbHandler()
{
    dbname = "birthday.db";
}

void DbHandler::createDatabase()
{
    QFile dbfile;
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(dbname);
    dbfile.setFileName(dbname);
    if (!dbfile.exists()) {
        db.open();
        QSqlQuery createquery;
        createquery.exec("CREATE TABLE birthdays (id int primary key auto_increment, "
                   "name varchar(80), bday varchar(10))");
        db.close();
    }
}

void DbHandler::insert(QString name, QString date)
{
    db.setDatabaseName(dbname);
    if (!db.open()){
        msgBox.setText("The Database could not be opened.");
        msgBox.exec();
    }
    else {
        QSqlQuery insertquery;
        insertquery.exec("INSERT INTO birthdays (name, bday) VALUES ('', '" + name + "', '" + date + "')");
    }

    db.close();
}

void DbHandler::getTodaysBirthdays(QString date)
{
    db.setDatabaseName(dbname);
    if (!db.open()){
        msgBox.setText("The Database could not be opened.");
        msgBox.exec();
    } else {
        QSqlQuery selectquery;
        selectquery.exec("SELECT name FROM birthdays where bday = " + date);
        while (selectquery.next()){
            QString name = selectquery.value(0).toString();
            qDebug() << name;
        }
    }
    db.close();
}

QString DbHandler::getAll()
{
    QString name = "false";
    db.setDatabaseName(dbname);
    if (!db.open()){
        msgBox.setText("The Database could not be opened.");
        msgBox.exec();
    } else {
        QSqlQuery selectquery;
        selectquery.exec("SELECT name FROM birthdays");
        while (selectquery.next()){
            name = selectquery.value(0).toString();
        }
    }
    db.close();
    return name;
}
In "getAll()" geht er mir nichtmal in die while-Schleife und ich find den Grund dafuer einfach nicht.
Waer genial wenn mir da jemand evtl helfen koennt.

thx
HappyEnding
Zuletzt geändert von HappyEnding am 16. Mai 2009 15:22, insgesamt 1-mal geändert.
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

Beitrag von Whitefurrows »

Was für ein Rückgabewert liefert die folgende Query?

Code: Alles auswählen

        createquery.exec("CREATE TABLE birthdays (id int primary key auto_increment, "
                   "name varchar(80), bday varchar(10))"); 
Ich denke wahrscheinlich FALSE, da Du keine SQLite-Datenbank erstellt hast.
HappyEnding
Beiträge: 26
Registriert: 5. März 2009 14:15

Beitrag von HappyEnding »

Ja der query returned "false". Das verstehe ich allerdings nicht, sollte laut Documentation nicht mit:

Code: Alles auswählen

db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(dbname); 
die Datenbank erstellt sein?
Und wieso wird mir die Datenbank dann in dem Ordner angezeigt?
HappyEnding
Beiträge: 26
Registriert: 5. März 2009 14:15

Beitrag von HappyEnding »

SOLVED EDIT (vorher Falschinformation auf die ich selbst reingefallen bin, sry dafuer):
Die Datenbank existiert, das Problem war der CREATE Query.
In SQLITE laeuft das mit dem AUTO_INCREMENT anders. Es existiert in jedem Table automatisch eine "ROWID" die AUTOINCREMENT ist. Weshalb eine zusaetzliche ID wenn nicht benoetigt sinnlos ist.

Code: Alles auswählen

createquery.exec("CREATE TABLE birthdays ('name' VARCHAR(80), 'bday' VARCHAR(10))");
Dieser Query funktioniert und damit funktioniert das Programm dann auch.
Danach kann die ID der Inserts mit "SELECT ROWID..." abgerufen werden.

Sry nochmal fuer falsches Solved.

Trotzdem Thx fuer die Hilfe.
Antworten