Seite 1 von 1

[SOLVED]SQLite Zugriffsproblem

Verfasst: 15. Mai 2009 17:48
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

Verfasst: 15. Mai 2009 23:53
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.

Verfasst: 16. Mai 2009 13:26
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?

Verfasst: 16. Mai 2009 15:25
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.