samedi 20 février 2016

Commit changes to SQLite database, that can be seen between QTabs

I have a simple application, where I can log in / out users. When user logs in, application shows appropriate tab on main window (employee/admin/customer). I have a QMainWindow with QTabWidget on it. In my QMainWindow I create a database (I implemented a special class for this):

class DataBase
{
public:

    DataBase();

    void initDatabase();
    void closeDatabase();

private:

    QSqlDatabase db;
};

DataBase::DataBase()
{
}

void DataBase::initDatabase()
{
    QString filename = "database.sql";
    QFile file(filename);

    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setHostName("localhost");
    db.setDatabaseName(filename);

    // create users table
    if(this->db.open())
    {
        QSqlQuery usersTableQuery;
        QString usersTableQueryStr = "CREATE TABLE IF NOT EXISTS USERS (ID INTEGER PRIMARY KEY NOT NULL, "
                                 "LOGIN TEXT,"
                                 "PASSWORD TEXT,"
                                 "FIRSTNAME TEXT,"
                                 "LASTNAME TEXT,"
                                 "EMAIL TEXT,"
                                 "ACCOUNT_TYPE INTEGER" 
                                 ");";

        if(usersTableQuery.exec(usersTableQueryStr))
        {
            qDebug() << "Create USERS table OK";
        }
        else
        {
            qDebug() << usersTableQuery.lastError().text();
        }
    }
    else
    {
        qDebug() << "DB is not opened!\n";
    }

    // create service table
    if(this->db.open())
    {
        QSqlQuery serviceTableQuery;
        QString serviceTableQueryStr = "CREATE TABLE IF NOT EXISTS SERVICE (ID INTEGER PRIMARY KEY NOT NULL, "
                                 "NAME TEXT,"
                                 "PRICE REAL"
                                 ");";
        if(serviceTableQuery.exec(serviceTableQueryStr))
        {
            qDebug() << "Create SERVICE table OK";
        }
        else
        {
            qDebug() << serviceTableQuery.lastError().text();
        }
    }
    else
    {
        qDebug() << "DB is not opened!\n";
    }
}

void DataBase::closeDatabase()
{
    db.close();
}

My tabs for employee, admin, client look like this one:

class AdminTab : public QWidget
{
    Q_OBJECT
public:
    explicit AdminTab(DataBase *db, QWidget *parent = 0);
//...

Everyone (employee,client,admin) can make changes in database (for instance, admin can insert services, users can check available services, etc). However, when admin adds a service (I make an insert operation on an open database), and logs out, when the client logs in, it can't see the changes made by the admin. When I start application again, and client logs in, it can see new added service.

Adding service looks like this:

bool DataBase::insertService(QString name, double price)
{
    if(!db.isOpen())
    {
        qDebug() << query.lastError();
        return false;
    }
    else
    {
        QSqlQuery query;
        query.prepare("INSERT INTO SERVICE (NAME, PRICE) "
                      "VALUES (:NAME, :PRICE)");
        query.bindValue(":NAME", name);
        query.bindValue(":PRICE", price);

        if(query.exec())
        {
            return true;
        }
        else
        {
            qDebug() << query.lastError();
        }
    }
    return false;
}

I guess it's the problem that the database is all the time opened, but how can I make the changes to be available just after I insert/remove something in database? I open the database when I create QMainWindow and close it in its destructor.

I thought about opening/closing the database every time I need to use it, but I can't say if it's a good solution.

Aucun commentaire:

Enregistrer un commentaire